我在用着$.when
链接一些 Deferred 对象,如果其中一个对象失败,always
方法将在失败后直接调用,即使我仍然有一些延迟器处于“待处理”状态。
var promises = [], defs = [];
for(var i=0 ; i < 10 ; i++){
defs.push($.Deferred());
promises.push(defs[i].promise());
}
var res = $.when.apply($, promises);
res.fail(function(){console.log('failed')});
res.done(function(){console.log('done')});
res.always(function(){console.log('always')});
res.then(function(){console.log('then, done')},
function(){console.log('then, failed')});
var j = 0;
var t = setInterval(function(){
if(j < 10){
if(j < 5) {
console.log('resolve');
defs[j++].resolve();
}
else {
console.log('reject');
defs[j++].reject();
}
}
else {
clearInterval(t);
}
}, 200);
Check 这个jsfiddle http://jsfiddle.net/cSy2K/1/.
也许这是正常行为。但是,在这种情况下,即使其中一些失败了,我怎样才能抓住我的链条的末端呢?
这是设计使然:一旦所有 Deferred 解析完毕,该方法就会解析其主 Deferred,或者一旦one的延期者被拒绝。
[...]
请注意,某些延期项目可能仍处于未解决的在那时候。
http://api.jquery.com/jQuery.when/ http://api.jquery.com/jQuery.when/
您可以保存对所有延迟的引用并单独跟踪它们。
像这样的事情:
var whenAll = function() {
var dfd = $.Deferred(),
len = arguments.length,
counter = 0,
state = "resolved",
resolveOrReject = function() {
if(this.state() === "rejected"){
state = "rejected";
}
counter++;
if(counter === len) {
dfd[state === "rejected"? "reject": "resolve"]();
}
};
$.each(arguments, function(idx, item) {
item.always(resolveOrReject);
});
return dfd.promise();
};
http://jsfiddle.net/cSy2K/2/ http://jsfiddle.net/cSy2K/2/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)