61

我有一个三层深层的延迟 ajax 调用链,理想情况下,当最深层完成时,它们会一直兑现承诺(让我想起了《盗梦空间》……“我们需要更深入!”)。

问题是我一次发送了许多 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.When文档,如果您的 ajax 调用之一失败,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

感谢您的回答 brittohalloran。我也在使用下划线,所以我能够用地图非常干净地应用你的解决方案,有点像这样:

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

恶人有用。

于 2012-08-06T22:10:01.557 回答