小编典典

$ .Deferred:如何检测何时执行了每个promise

javascript

我有许多异步任务需要完成,所以我使用了Promise。

我需要检测每个诺言何时已执行(已解决和否决)。在那之前,我不能继续执行。

我正在使用这样的东西:

$.when(promise1, promise2, ...).always();

但是此代码是错误的,因为该when方法具有惰性求值,并且一旦promise之一失败,它就会立即返回。因此always,一旦承诺之一失败,回调也将运行。

我想在编码一个解决办法,但这种使用情况是如此普遍,也许有人已经做它已经,或者也许有这样做只使用jQuery的(如果不是,这将是很好添加的,甚至一种方式Promise.whenNonLazyPromise.when(promise1, promise2, ..., false)在未来。

这可能吗?


阅读 329

收藏
2020-05-01

共1个答案

小编典典

更复杂的诺言库有一个allSettled()类似的功能QPromise.settle类似bluebird

在jQuery中,您也可以自己实现这样的功能,并$使用它扩展名称空间,但这仅在您经常需要且性能优化的情况下才需要。

一个更简单的解决方案是为您正在等待的每个人创建一个新的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

2020-05-01