次のようなものを探している場合:
Send request A
when A returns,
Send request B(result a)
when B returns,
Do C(response b)
次に、それぞれをプロミスにする必要があり、クロージャーに注意を払う必要があります (コールバックからの戻り値を収集できないため)。
a_done = something_that_returns_a_promise();
a_done.then(function (a_result) {
var b_done = something_that_returns_a_promise(a_result);
b_done.then(function (b_result) { do_C(b_result); });
});
あなたが何かを探しているなら
Send request A
Send request B
when A && B return,
Do C
次に、いくつかのプロミスを取り、プロミスを返す関数を見ています。
a = something_returning_a_promise();
b = something_returning_a_promise();
a_and_b_done = when(a, b);
a_and_b_done.then(function (result1, result2) { do_c(result1, result2); })
.then(show_results);
のようなことをする
a_done.then(fillRows).then(showResults);
複数の非同期呼び出しを行うことはできません... ...一連の同期タスクを次々に連鎖させることができます (または、到着する順序がまったく問題にならない非同期呼び出しを行うことができます)。 .
.then
また
.done
または何でも、特別なことは何もしません-タスクを配列に追加します。
async promise が返されると (または既に返されて解決されている場合)、そのリストを順番に調べて、すべてのコールバックを起動し、解決されたデータを渡します (そして、「成功」または「失敗」を呼び出します) " 操作の成功に基づくコールバック)。
したがって、非同期コールバックごとに 1 つの promise が必要です。また、コールバックを連鎖させようとする場合でも、それぞれをクロージャ (次の promise を構築するものに結果を渡すクロージャ) 内にラップする必要があります。
ここでは jQuery $.Deferred()
、deferred.promise()
、deferred.resolve()
、を使用しています。
他のライブラリでは用語が異なる場合がありますが、同様に動作します。deferred.reject()
promise.done()
promise.fail()
$.when()
var ImageLoader = function (name, format) {
var loading = $.Deferred(),
img = new Image(),
url = name + (format || ".png");
img.onload = function () {
loading.resolve(img);
};
img.onerror = function () {
loading.reject("Image failed to load:" + name);
};
img.src = url;
return loading.promise();
};
var imgLoaded = ImageLoader("//mysite.com/myimg");
imgLoaded.done(function () { console.log("img 1 loaded"); });
imgLoaded.fail(function (msg) { console.log(msg); });
var img2Loaded = ImageLoader("//yoursite.com/yourimg", ".jpg");
img2Loaded.done(function () { console.log("img 2 loaded"); });
img2Loaded.fail(function (msg) { console.log(msg); });
var showImages = function (img1, img2) {
document.body.appendChild(img1);
document.body.appendChild(img2);
};
var both_loaded = $.when(imgLoaded, img2Loaded);
both_loaded.done(showImages);
これは厄介で複雑な例ですが、エレガントにするのではなく、すべての部分を示す方法で記述しようと考えました。