3

最近、可変数のjqueryリクエストをトリガーする方法について質問したところget()、非常に効率的なソリューションとしてこのコードを受け取りました。

var d = new $.Deferred();
var promise = d.promise();
var results = [];
for (var i = 0; i < 5; i++) {
    (function(i) {
        promise = promise.then(function() {
            return $.ajax('/echo/json/', {
                data: {
                    json: JSON.stringify({foo: i})
                }
            }).done(function(data) {
                results[i] = data;
            });
        });
    }(i));
}

promise.done(function() {
    console.log(results);
});

d.resolve(); 

フィドル

私は、これdone()がそれぞれに接続された複数のsでどのように正確に機能するかpromise.then()、そして最後done()にpromise自体に接続されたものの説明を探しています。約束(私が理解していることから、特別な種類の延期されたもの自体が)を実行でき、それから延期されたもの自体も実行できるということですか?ループに含まれていなかった場合、この構文は、たとえば3つの連続したajaxリクエストに対してどのようになりますか?頭を悩ませようとしているだけです。ありがとう!

4

2 に答える 2

7

遅延オブジェクトの配列がある場合は、実際にそれらを使用して処理しwhenapplypromiseを取得して、それらで使用$.done()できます。

$.when.apply($, deferredArray).done(function() {
   for (var i = 0; i < arguments.length; i++) {
      //arguments[i] is the return of the singular done() statement    
   }
});

これは、操作している遅延オブジェクトの数がわからない場合にかなりうまく機能します。

于 2013-02-21T21:52:57.497 に答える
3

promise は deferred のラッパーであり、resolveandrejectメソッドを隠します。これは deferred のパブリック インターフェイスのようなものです。遅延またはその約束でそれらを使用する場合、違いはありませんthen()done()これからは、両方に対して据え置きという用語を使用します。

そうは言っても、done()連鎖を可能にする遅延自体を返します。このように、完了 (および失敗) ハンドラーをいくつでも追加できます。それらは1つずつ呼び出されます。

then()独自の完了ハンドラーと失敗ハンドラーを持つことができる新しいdeferred* を返します。

promiseコードでは、各ループ反復で変数の deferred を置き換えることに注意してください。そのため、 finaldone()は元の deferred ではなく、 last によって返された最新のもので呼び出されthen()ます。

1行にチェーンされたすべての呼び出しは次のようになります(それぞれが新しいpromiseを返します。メソッドが呼び出されるthen()場所をマークしました):done()

d.then().done().then().done().then().done().then().done().done();
         ^^^^^^        ^^^^^^        ^^^^^^        ^^^^^^^^^^^^^
        promise 1     promise 2     promise 3       promise 4

*) 実際にはその約束

于 2013-02-21T21:15:53.810 に答える