为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2019-10-18 13:47:54
当多个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。我该怎么做?
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

我认为最简单的方法是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() { ... }块中。


查看完整回答
反对 回复 2019-10-18
?
偶然的你

TA贡献1841条经验 获得超3个赞

它帮助我消除了我创建的黑客程序,其中我在某种程度上人为地解决了诺言(无论潜在结果如何),以便我可以使用“何时”批处理多个请求并使用“完成”不管他们成功/失败都继续前进。


我正在“回答” 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',它将被一次调用不管这些调用成功与否,异步调用都将完成。


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 524 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信