jQuery.when-何时不再延迟所有“未解决”(已解决或被拒绝)的回调?

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


该方法将


所有“递延者”解决后,立即解析其主递延者;或

只要其中一个“延期者”被拒绝,就拒绝其主“延期者”。

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


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


    // foo & bar are jqXHR objects for the requests


});

在多个Deferred的情况下,其中一个Deferred被拒绝,当立即解散其主Deferred的失败回调时,jQuery。即使此时某些Deferred仍未解决:


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


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


});

当所有传递给jQuery的Deferred不再“未解决”(即全部“已解决”或“已拒绝”)时,我需要触发回调。我可以发送具有200个OK代码的JSON对象(而不是发送带有404 Not Found错误状态代码的JSON),并在done()方法中确定成功/错误,但是我更喜欢保持API RESTful。我该怎么做?


慕哥9229398
浏览 527回答 3
3回答

RISEBY

我认为最简单的方法是Deferred为每个AJAX请求保留一个辅助对象,并确保始终解决该问题: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});这是利用.complete()jQuery添加到AJAX 方法的Promise中的附加AJAX方法,该方法被同时用于已解决和已拒绝的Promise。注意:d1.resolve本身可作为回调,它不需要包装在一个function() { ... }块中。

偶然的你

它帮助我消除了我创建的黑客程序,其中我在某种程度上人为地解决了诺言(无论潜在结果如何),以便我可以使用“何时”批处理多个请求并使用“完成”不管他们成功/失败都继续前进。我正在“回答” Alnitak的答案,希望为他的建议提供另一种用途,该建议支持任意数量的潜在承诺。var asyncFunc, entity, entities, $deferred, $deferreds;// ...foreach (entity in entities) {    $deferred = $.Deferred();    $deferreds.push($deferred);    asyncFunc(entity).done(...).fail(...).always($deferred.resolve);}// ...$.when.apply($, $deferreds).done(...)这是伪JavaScript,但是应该传达这种方法。对于某些任意大小的实体集,为每个实体创建一个递延($ deferred)并将其推送到一个数组($ deferreds),进行异步调用,根据需要添加完成/失败,但始终包含一个“始终”来解决此问题实体的延期付款。注意,“始终”接收延迟的解析功能而不是其调用。'when'将$ deferreds数组转换为'when'的参数列表,并且由于保证了这组deferreds的解析(感谢all),现在可以定义一个'done',它将被一次调用不管这些调用成功与否,异步调用都将完成。
打开App,查看更多内容
随时随地看视频慕课网APP