deferred.always()太火了

时间:2013-08-31 21:07:10

标签: javascript jquery

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/

1 个答案:

答案 0 :(得分:4)

当{em>所有 <{1}}时,.when(...)会触发回调,或者只要其中任何 resolved }。

由于第二次AJAX调用导致错误,一旦第二次AJAX调用错误发生,rejected就会发生,无论第一次AJAX调用是否成功。

我知道的唯一解决方案是为每个AJAX请求保留第二个.when().always(),然后在每个AJAX请求的$.Deferred处理程序中resolve。然后在always电话中使用那些延迟:

$.when