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/

10-11 13:27