我得到了一个动态异步请求(对于jsfiddle,我使用了ajax),无论成功与否,我都需要等待,这意味着即使某些请求失败,我也只需要知道所有进程都已完成。
//动态:在我的情况下,这是由ajax请求产生的,因此后续异步请求的数量是灵活的
所以我最初使用这段代码:
$.when.apply($,deferreds).done(function() {
$("div").append("<p>All done!</p>");
}).fail(function(){
$("div").append("<p>Something failed!</p>");
});
但是在其中一个延迟失败的情况下,将立即调用失败回调。我尝试将其更改为always(),但结果是:
未捕获的TypeError:对象#没有方法'always'
那么如何为此实现always()类型的解决方案呢?
我的原始来源:jQuery Deferred - waiting for multiple AJAX requests to finish
答案 0 :(得分:9)
如果您只想等待$.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();
}));
答案 1 :(得分:0)
好像Kevin B建议的那样。我使用了一个自定义延迟,无论asynch请求的结果如何都会解决。
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();
});