当多个 Deferred 对象传递给jQuery.when时,该方法从一个新的“主” Deferred 对象返回 Promise,该对象跟踪它已传递的所有 Deferred 的聚合状态。
该方法将要么
- 在所有 Deferred 解决后立即解决其 master Deferred,或
- 只要其中一个 Deferred 被拒绝,就拒绝其 master Deferred。
如果主 Deferred 被解析(即所有 Deferred 解析),则将传递给 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 的情况下,其中一个 Deferred 被拒绝,jQuery.when IMMEDIATELY FIRES 为其主 Deferred 的失败回调,即使此时某些 Deferred 可能仍未解决:
$.when( $.getJSON('foo'), $.getJSON('bar') ).fail(function(req) {
// req is the jqXHR object for one of the failed requests
});
当传递给 jQuery.when 的所有 Deferred 不再“未解决”(即,所有“已解决”或“拒绝”)时,我需要触发回调。我可以发送带有 200 个 OK 代码的 JSON 对象(而不是发送带有 404 Not Found 错误状态代码的 JSON)并在 done() 方法中确定成功/错误,但我更愿意让我的 API 保持 RESTful。我怎样才能做到这一点?