3 回答
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() { ... }块中。
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',它将被一次调用不管这些调用成功与否,异步调用都将完成。
添加回答
举报