読者です 読者をやめる 読者になる 読者になる

いつの間にか同期と非同期の融合の時代になってた

JavaScript

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で実装されているから, 今まで触っていなかった自分が, 少し凹む.