JavaScriptについては, 自分はいっぱいのことを知ってると思ってた.
だけど, ちょっと触らないうちに, 世界はダイナミックに動いているようだ.
取り敢えず, どんな他の解説を見るより, 次の動画を見て欲しい.
Deferreds - Putting Laziness to Work | Dan Heberden | Bay Area jQuery Conf 2011
http://vimeo.com/22687950
こういう動画は, とても面白い. (ハプニング含め
キャッシュの例で感動してしまった.
function readCacheSynchronous (foo) { return cache[foo]; } output(readChacheSynchronous(hoge));
と,
function fetchAsynchronous (foo, callback) { $.ajax({ ... data: { foo: foo }, success: function (data) { callback(data); } }); }; fetchAsynchronous(hoge, function (data) { output(data); });
のようなパターン.
前者が「すぐさま答えが出てくる」関数で, 後者が「データが決定するのに時間がかかる」関数. (直感的には.
これらの関数は, 呼び出し方からして非常に神経を尖らせなければならない.
また, node.jsなどでは, 後者のような関数が多用され, しばしばコールバック地獄と言われた.
Deferredはこれらを融合するソリューションを提供する.
関数の融合.
function getData (foo) { return cache[foo] || $.ajax({ data: { foo: foo } }); } $.when( getData(hoge) ) .done(function (data) { output(data); });
WOW!
getDataは, キャッシュがあればキャッシュからデータを返し, そうでなければDeferredオブジェクトを返す.
今の自分にとっては, ある意味では「気持ち悪い」が, 本当にこれが効果的なのかどうかは, これからコードで使ってみる事で感触を試してみることにする.
なんというか, すでにjQueryで実装されているから, 今まで触っていなかった自分が, 少し凹む.