javascript – jQuery.when – 回调当所有延迟的不再“未解决”(解决或拒绝)?

当多个Deferred对象传递到jQuery.when时,该方法从一个新的“主”Deferred对象返回Promise,该对象跟踪它已经传递的所有Deferred对象的聚合状态。

该方法将

>解决其主人延迟,一旦所有延迟解析,或
>拒绝其主人一旦其中一个被延迟人被拒绝就被推迟。

如果主Deferred已解决(即所有Deferreds解析),它将传递给jQuery.when的所有Deferred的解析值。例如,当Deferred是jQuery.ajax()请求时,参数将是请求的jqXHR对象,按照它们在参数列表中给出的顺序:

$.when( $.getJSON('foo'), $.getJSON('bar') ).done(function(foo, bar) {

    // foo & bar are jqXHR objects for the requests

});

在多个Deferred的情况下,其中一个Deferreds被拒绝,jQuery.when IMMEDIATELY FIRES,它的主Deferred的失败回调,即使一些Deferreds仍然可能在那一点仍然未解决:

$.when( $.getJSON('foo'), $.getJSON('bar') ).fail(function(req) {

    // req is the jqXHR object for one of the failed requests

});

我需要触发一个回调,当所有Deferreds传递给jQuery.when不再“未解决”(即,所有都是“已解决”或“拒绝”)。我可以发送带有200个OK代码的JSON对象(而不是发送带有404 Not Found错误状态代码的JSON),并确定done()方法中的成功/错误,但我更喜欢保持我的RESTful REST。我该如何做到这一点?

我认为最简单的方法是为每个AJAX请求保留一个辅助Deferred对象,并确保该对象总是被解析:

var d1 = $.Deferred();
var d2 = $.Deferred();

var j1 = $.getJSON(...).complete(d1.resolve);
var j2 = $.getJSON(...).complete(d2.resolve);

$.when(j1, j2).done( only fires if j1 AND j2 are resolved );

$.when(d1, d2).done(function() {
     // will fire when j1 AND j2 are both resolved OR rejected
     // check j1.isResolved() and j2.isResolved() to find which failed
});

这是使用额外的AJAX .complete()方法,jQuery添加到它的AJAX方法的promise,它被称为已解决和被拒绝的promise。

NB:d1.resolve本身就是一个回调函数,它不需要被包装在一个function(){…}块中。

http://stackoverflow.com/questions/5824615/jquery-when-callback-for-when-all-deferreds-are-no-longer-unresolved-either

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:javascript – jQuery.when – 回调当所有延迟的不再“未解决”(解决或拒绝)?