【发布时间】:2011-08-15 00:59:04
【问题描述】:
当将多个 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。我怎样才能做到这一点?
【问题讨论】:
-
“我需要触发回调”——回调是什么,是失败还是成功?也许您可以提供一个响应流的示例,以及它们何时应该/不应该解决或失败,即
page1 --> 200 got page, page2 --> 400 invalid page, page3 --> 200 got page- 例如,在这种情况下应该调用 .fail 似乎很明显。 -
@Gary Green - 我正在对两个 JSON 资源进行并行请求;如果两者都成功(返回 200 OK),我正在处理两者。如果一个失败(返回 404 Not Found)并且一个成功,我将显示一种错误消息。如果两者都失败,我将显示另一种错误消息。
-
对于任何感兴趣的人,Alan 在 jQuery 的 bug 跟踪器上提交了一个(名称不佳的)功能请求:Ticket #9386 "DEFERREDS FEATURE REQUEST"。它以“wontfix”的形式很快就关闭了,其中最重要的评论来自 jaubourg:
-1, Start with a plugin, I'll gladly incorporate this in ajaxHooks (which I'd like to have some deferred helpers too)——很高兴在这里看到这样的插件作为答案! -
我为此向 jQuery 提出了另一个功能请求以及对
$.when()的相关增强:OPTIONS PARAMETER FOR $.WHEN() TO PROVIDE ALTERNATIVE SEMANTICS。它也已关闭,但 jaubourg 添加了很好的分析和建议,这将有助于任何对此问题感兴趣的人。
标签: javascript jquery rest jquery-deferred