对于jQuery.when()
,如果一个请求失败,那么所有请求都会失败。
$.when(deferred1, deferred2).then(function() {
// Called only after both deferred are resolved
}, function() {
// Called immediately after one of the deferreds is rejected
});
你怎么能等待所有的东西执行,即使失败呢?我尝试使用.always()
而不是.then()
,但在第一次失败后也会立即调用回调。
一种(丑陋的)解决方案是使用标志来控制这两个操作何时完成,并在每个操作上使用.always()
(不使用$.when()
)。
var deferred1Complete = false;
var deferred2Complete = false;
function callback() {
if (deferred1Complete && deferred2Complete) {
// Execute after both deferred are either resolved or rejected
}
}
deferred1.always(function() {
deferred1Complete = true;
callback();
});
deferred2.always(function() {
deferred2Complete = true;
callback();
});
有没有更好的方法来做这件事?
发布于 2013-03-09 12:21:20
另一种解决方案(不是很难看)是链接延迟.always()
回调。
deferred1.always(function() {
deferred2.always(function() {
// Execute after both deferred are either resolved or rejected
});
});
我写了一个小函数来处理这个问题:
function whenAlways() {
var chain = $.extend([], arguments);
return new $.Deferred(function(deferred) {
var callback = function() {
if (chain.length == 0) {
deferred.resolve();
return;
}
var object = chain.shift();
$.when(object).always(callback);
};
callback();
}).promise();
}
用法:
whenAlways(deferred1, deferred2)
.done(function() {
// Execute after both deferred are either resolved or rejected
});
https://stackoverflow.com/questions/15306401
复制相似问题