var xhr1 = $.ajax({ url:'/echo/json/', data:{ delay: 3 } }),
xhr2 = $.ajax({ url:'/echo/json/something/invalid', data:{ delay: 3 } });
xhr1.always(function(){
console.log('xhr1 always');
});
xhr2.always(function(){
console.log('xhr2 always');
});
$.when.apply($, [xhr1, xhr2]).always(function(){
console.log('xhr1 & xhr2 always');
});
结果(控制台):
xhr2 always
xhr1 & xhr2 always
xhr1 always
为什么
deferred.always()
不等待两个ajax调用完成?所有请求完成后,无论其状态如何,是否可以使用任何延迟的回调?http://jsfiddle.net/W9A3f/
最佳答案
当.when(...)
全部为resolved
或任何一个为rejected
时,将触发其回调。
由于第二个AJAX调用导致错误,因此,无论第一个AJAX调用是否成功,.when().always()
都会在第二个AJAX调用错误发生时发生。
对于您的情况,我知道的唯一解决方案是为每个AJAX请求保留第二个$.Deferred
,然后在每个AJAX请求的resolve
处理程序中保留第二个always
。然后在您的$.when
调用中使用这些延迟:
var def1 = $.Deferred();
xhr1.always(def1.resolve);
var def2 = $.Deferred();
xhr2.always(def2.resolve);
$.when(def1, def2).done(function() {
// only called when the two XHRs complete, whether
// they succeeded or not
});
关于javascript - deferred.always()触发得太早,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18552837/