61

私は延期されたajax呼び出しの3層の深いチェーンを持っており、理想的には、最も深い層が終了したときに約束を完全に開始します(私はインセプションのことです...「私たちはもっと深く行く必要があります!」)。

問題は、一度に多くの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();
};
4

3 に答える 3

115

.when()、および.apply()複数の deferredを使用できます。非常に便利:

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
    });
}
于 2011-07-02T16:50:11.983 に答える
27

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

結果がどうであれ、すべての呼び出しを待ちたい場合は、次のように別の 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();
});
于 2012-11-29T14:08:06.113 に答える
7

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

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

邪悪な便利。

于 2012-08-06T22:10:01.557 に答える