我有许多异步任务需要完成,所以我使用了Promise。
我需要检测每个诺言何时已执行(已解决和已拒绝)。在那之前,我不可以继续执行。
我正在使用这样的东西:
$.when(promise1, promise2, ...).always();
但是此代码是错误的,因为该when
方法具有惰性求值,并且一旦promise之一失败,它就会立即返回。因此always
,一旦承诺之一失败,回调也将运行。
我想在编码一个解决办法,但这种使用情况是如此普遍,也许有人已经做它已经,或者也许有这样做只使用jQuery的(如果不是,这将是很好添加的,甚至一种方式Promise.whenNonLazy
或Promise.when(promise1, promise2, ..., false)
在未来。
这可能吗?
更复杂的诺言库有一个allSettled()
类似的功能Q
或Promise.settle
类似蓝鸟。
在jQuery中,您也可以自己实现此类功能并$
使用其扩展名称空间,但这仅在您经常需要且性能优化时才是必需的。
一种更简单的解决方案是为您正在等待的每个人创建一个新的promise,并即使拒绝了基础的promise也能兑现这些promise。然后,您可以$.when()
毫无问题地使用它们。简而言之:
// using Underscore's .invoke() method:
$.when.apply(null, _.invoke(promises, "then", null, $.when)).done(…)
更稳定:
$.when.apply($, $.map(promises, function(p) {
return p.then(null, function() {
return $.Deferred().resolveWith(this, arguments);
});
})).then(…);
您可能需要对then
回调进行一些更改,以区分final中已完成和已拒绝的结果done
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句