jQuery Deferred-等待动态异步请求全部完成,即使有些请求失败



我收到了一个动态异步请求(对于我使用ajax的jsfiddle),无论成功与否,我都需要等待,这意味着我只需要知道所有进程都已完成,即使有些请求失败了。

//动态:在我的例子中,这是由ajax请求产生的,因此后续异步请求的数量是灵活的

所以我最初使用这个代码:

    $.when.apply($,deferreds).done(function() {
        $("div").append("<p>All done!</p>");
    }).fail(function(){
        $("div").append("<p>Something failed!</p>");
    });

但在其中一个延迟失败的情况下,将立即调用fail回调。我试着把它改为always(),但结果是:

未捕获类型错误:对象#没有方法"始终"

那么,我该如何实现always()类型的解决方案呢?

Fiddle

我的原始来源:jQuery Deferred-等待多个AJAX请求来完成

如果你只想等待$.Deferred的列表结束,而不管它们是rejected还是resolved,我在你的原始源jQuery Deferred中给出了解决方案-等待多个AJAX请求完成:

$.when.apply($, $.map(deferreds, function(d) {
    var wrapDeferred = $.Deferred();
    // you can add .done and .fail if you want to keep track of each results individualy
    d.always(function() { wrapDeferred.resolve(); });
    return wrapDeferred.promise();
}));

好吧,就像Kevin B建议的那样。我使用了一个自定义延迟,无论异步请求的结果如何,它都将被解决。

var deferreds = $.map(i, function (count, index){
    var waitingProcess = new $.Deferred(); //Here is the custom deferred
    if(count == 7) {
        $.Deferred().fail(function(){
            $("div").append("<p>Task #" + count + " failed.");
            waitingProcess.resolve(); //resolve it no matter the outcome
        }).reject();
    }else{
        $.post('/echo/html/', {
            html: "<p>Task #" + count + " complete.",
            delay: count
        }).success(function(data) {
            $("div").append(data);
            waitingProcess.resolve(); //resolve it no matter the outcome
        });
    }
    return waitingProcess.promise();
});

Fiddle

最新更新