我有许多异步任务需要完成,所以我使用了Promise。
我需要检测每个诺言何时已执行(已解决和否决)。在那之前,我不能继续执行。
我正在使用这样的东西:
$.when(promise1, promise2, ...).always();
但是此代码是错误的,因为该when方法具有惰性求值,并且一旦promise之一失败,它就会立即返回。因此always,一旦承诺之一失败,回调也将运行。
when
always
我想在编码一个解决办法,但这种使用情况是如此普遍,也许有人已经做它已经,或者也许有这样做只使用jQuery的(如果不是,这将是很好添加的,甚至一种方式Promise.whenNonLazy或Promise.when(promise1, promise2, ..., false)在未来。
Promise.whenNonLazy
Promise.when(promise1, promise2, ..., false)
这可能吗?
更复杂的诺言库有一个allSettled()类似的功能Q或Promise.settle类似bluebird。
allSettled()
Q
Promise.settle
在jQuery中,您也可以自己实现这样的功能,并$使用它扩展名称空间,但这仅在您经常需要且性能优化的情况下才需要。
$
一个更简单的解决方案是为您正在等待的每个人创建一个新的promise,即使底层的promise被拒绝,也要兑现它们。然后,您可以$.when()毫无问题地使用它们。简而言之:
$.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。
then
done