web-dev-qa-db-ja.com

jQuery遅延-複数のAJAX要求の終了を待機しています

遅延Ajax呼び出しの3層の深層チェーンがあり、理想的には、最も深い層が終了すると、約束を完全にキックします(Inceptionのようになります...「もっと深くする必要があります!」)。

問題は、私は一度に多くの(おそらく数百の)Ajaxリクエストを送信し、それらすべてが完了するまで延期する必要があることです。最後に行われたものに頼ることはできません。

function updateAllNotes() {
    return $.Deferred(function(dfd_uan) {
        getcount = 0;
        getreturn = 0;
        for (i = 0; i <= index.data.length - 1; i++) {
            getcount++;
            $.when(getNote(index.data[i].key)).done(function() {
                // getNote is another deferred
                getreturn++
            });
        };
        // need help here
        // when getreturn == getcount, dfd_uan.resolve()
    }).promise();
};
56
brittohalloran

.when().apply()を複数の遅延で使用できます。非常に便利:

function updateAllNotes() {
    var getarray = [],
        i, len;

    for (i = 0, len = data.length; i < len; i += 1) {
        getarray.Push(getNote(data[i].key));
    };

    $.when.apply($, getarray).done(function() {
        // do things that need to wait until ALL gets are done
    });
}
106
brittohalloran

jQuery.When doc。ajax呼び出しの1つが失敗すると、後続のすべてのajax呼び出しがまだ終了していなくても、failマスターコールバックが呼び出されます。この場合、すべての通話が終了したかどうかはわかりません。

すべての呼び出しを待ちたい場合は、結果がどうであっても、次のような別のDeferredを使用する必要があります。

$.when.apply($, $.map(data, function(i) {
    var dfd = $.Deferred();
    // you can add .done and .fail if you want to keep track of each results individualy
    getNote(i.key).always(function() { dfd.resolve(); });
    return dfd.promise();
});
27
Mordhak

答えブリットハロランをありがとう。私もアンダースコアを使用しているので、次のようにマップを使用してソリューションを非常にきれいに適用できました。

$.when.apply($, _.map(data, function(i) {
    return getNote(i.key);
})).done(function() {
    alert('Be Happy');
});

邪悪な便利。

7
Travis