JSDeferredを使う
JSDeferredは,
例えば,
リスト6
// http.get は URI をとって Deferred を返す関数
var results = [];
next(function () {
return http.get("/foo.json").next(function (data) {
results.push(data);
});
}).
next(function () {
return http.get("/baz.json").next(function (data) {
results.push(data);
});
}).
next(function () {
return http.get("/baz.json").next(function (data) {
results.push(data);
});
}).
next(function () {
alert(results);
});
少々長くなりましたが,
リスト7
var wants = ["/foo.json", "/bar.json", "/baz.json"];
var results = [];
loop(wants.length, function (i) {
return http.get(wants[i]).next(function (data) {
results.push(data);
});
}).
next(function () {
alert(results);
});
この時点でかなり簡潔になりましたし,
リスト8
parallel([
http.get("/foo.json"),
http.get("/bar.json"),
http.get("/baz.json")
]).
next(function (results) {
alert(results);
});
このように,
ちなみに
JSDeferredはjAutoPagerize(注1)を作る過程で生まれたいくつかの欲求を解決するために作られました。そのときは,キャッシュを透過的に実装したい,というのが一番の目的でしたが,仕組みを作っているうちに一般化したくなったためにJSDeferredとして作りはじめました。- 注1
- AutoPagerizeの別実装。
JSDeferredは何を解決しないか
- JSDeferredはブラウザ間の挙動の差を吸収するためのライブラリではない
- JSDeferredは非同期処理の
「書き方」 を変えるだけ
クロスブラウザのためのライブラリではない
JSDeferredは単機能なライブラリであって,
役割が違うものなので,
「書き方」を変えるだけ
JSDeferredは基本的には
コールバックを受け取る,
これを解決して,
今回はJavaScriptにおける非同期処理の確認と,