0
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/

4

1 回答 1

4

将在它们全部.when(...)时触发它的回调,或者一旦它们中的任何一个是。resolvedrejected

由于第二次 AJAX 调用会导致错误,因此.when().always()无论第一次 AJAX 调用是否成功,只要发生第二次 AJAX 调用错误,就会发生错误。

对于您的方案,我知道的唯一解决方案是$.Deferred为每个 AJAX 请求保留一秒钟,然后resolve是每个 AJAX 请求的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
});
于 2013-08-31T21:15:06.667 回答