【问题标题】:jQuery Deferred - waiting for dynamic async requests to finish all even if some failedjQuery Deferred - 等待动态异步请求完成,即使有些失败
【发布时间】:2013-02-13 04:21:11
【问题描述】:

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

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

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

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

但是在其中一个deferred失败的情况下,fail回调会立即被调用。我尝试将其更改为always(),但结果是:

Uncaught TypeError: Object # has no method 'always'

那么我怎样才能为此实现一个 always() 类型的解决方案呢?

Fiddle

我的原始来源:jQuery Deferred - waiting for multiple AJAX requests to finish

【问题讨论】:

  • 我建议使用自定义延迟来计算成功和失败,然后在最后解决,尽管 .always 也应该在这里工作。

标签: jquery asynchronous jquery-deferred


【解决方案1】:

如果您只想等待$.Deferred 的列表结束,无论它们是rejected 还是resolved,您都可以在原始来源jQuery Deferred - waiting for multiple AJAX requests to finish 中的答案中找到解决方案:

$.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();
}));

【讨论】:

  • 妈的,答案已经在源码中了。 0_0 我没看到。感谢您的回答。
  • 非常感谢您,我不是真正的 Javascript 编码员,这救了我的命!你知道我如何才能确定哪些有效,哪些失败(以及为什么)?
  • 您在最后一行缺少右括号,应该是 }));
【解决方案2】:

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

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

【讨论】:

  • 那个神奇的数字 7 是从哪里来的?可以代替计算吗?
  • 只模拟其中一个请求失败的情况。
猜你喜欢
  • 2011-09-26
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2020-10-04
  • 2018-10-20
  • 2012-05-04
相关资源
最近更新 更多