8

コード例: http://jsfiddle.net/MhEPw/1/

2 つの jQuery Deferred オブジェクトがあります。

複数の「非同期」リクエストを発生させたい - そしてそれらがすべて実行された後、指定された順序でコールバック (.done 関数) を実行する必要があります。残念ながら、それらは順番に実行されません。

Deferred が提供しない機能をここで探しているのではないでしょうか?

4

2 に答える 2

5

必要なことは、すべてのリクエストを 1 つのマスター遅延オブジェクトにリンクし、すべてのコールバックをその promise に登録することです。マスター遅延オブジェクトは、個々のリクエストをリッスンし、それに応じて解決する必要があります。これを実現する最も簡単な方法は、鶏が先か卵が先かという問題を回避するために、すべての遅延オブジェクトを前もって定義することです。

var d1 = $.Deferred();
var d2 = $.Deferred();
var def = $.when(d1, d2);

def.done(function() {
    alert(1);
});
setTimeout(function() {
    d1.resolve();
}, 3000);

def.done(function() {
    alert(2);
});
setTimeout(function() {
    d2.resolve();
}, 1000);

フィドル: http://jsfiddle.net/pVVad/

遅延オブジェクト定義の順序を変更することは可能ですが、例がより複雑になります。

于 2011-03-01T20:11:43.667 に答える
1

Adam、「setTimeout」を「for」で変更すると、それが順番に実行されることがわかります。setTimeout は「別のアクション」を呼び出す「トリガー」を追加します。この「別のアクション」は、指定した時間内に実行されます。 、しかし setTimeout 呼び出しは順番に実行されます。

setTimeout を使用しない場合、スクリプトは順番に実行されます。

于 2011-03-01T19:53:48.097 に答える