【问题标题】:Correct way to wait for all resolves等待所有解决的正确方法
【发布时间】:2015-09-23 13:09:14
【问题描述】:

我需要等到所有的承诺都被解决或拒绝,然后才执行回调。似乎Q 的当前实现在一个 Promise 被拒绝后立即触发回调,这是测试:

var ps = [];
var d1 = $q.defer();
var d2 = $q.defer();
ps.push(d1.promise, d2.promise);

setTimeout(function () {
    d1.reject()
}, 2000)

setTimeout(function () {
    d2.resolve()
}, 5000)

$q.all(ps).then(function () {
    // is not triggered
}).catch(function () {
    //triggered after 2000 ms, I need this triggered after 5000ms
})

我怎样才能实现我想要的?

【问题讨论】:

标签: javascript angularjs promise q


【解决方案1】:

如果您想知道所有承诺何时完成(履行或拒绝),您可以使用$q.allSettled() 而不是$q.all()

如果您想知道哪些承诺被拒绝,您将不得不遍历返回的结果以查询哪些承诺被拒绝。 Q 文档有一个$q.allSettled() 的示例用法。

复制自 Q 文档:

Q.allSettled(promises)
.then(function (results) {
    results.forEach(function (result) {
        if (result.state === "fulfilled") {
            var value = result.value;
        } else {
            var reason = result.reason;
        }
    });
});

【讨论】:

  • 非常感谢,在 ES6 Promise 中有类似的东西吗?我在Q 和 ES6 承诺之间找不到很好的比较,也许你知道一个很好的资源来阅读?
  • @Maximus - ES6 Promise 没有与 allSettled() 等效的内容。它可以自己建造。你可以看到我写的一个实现 here 在我称为 promiseSettle() 的函数中只使用了 ES6 承诺。编码并不难。
  • 谢谢,您是否将链接中的function promiseSettle(promises) { 函数称为等效于allSettled?有没有比较好的资源?
  • @Maximus - 我在那个答案中的promiseSettle() 函数与Q.allSettled() 的接口不同,但它具有相同的目的并且工作方式相似。我没有简单的比较链接。 ES6 的 Promise 非常简单。像 Q 和 Bluebird 这样的库在 ES6 Promise 上提供了很多额外的特性,当你开始使用 Promise 做很多事情时,其中许多特性非常有用。您可以查看MDN description of ES6 promises here 并将其与 Q 的内容进行比较。
  • @Maximus - 我的 node.js 开发不只使用原生承诺。我发现像 Q 和 Bluebird 这样的库所具有的高级功能非常有用,并且我发现使用像 Q 或 Bluebird 这样的超集替换库没有任何缺点(我个人对 Bluebird 更熟悉,但我的理解是 Q 是相似的)。在浏览器 JS 开发中,一个缺点是页面中多了一个脚本(尽管如果您使用公共 CDN,它可能已经被缓存了)。
猜你喜欢
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2015-11-30
  • 2022-01-09
  • 2010-09-24
相关资源
最近更新 更多