等待所有解决的正确方法

Correct way to wait for all resolves

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

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
})

我怎样才能达到我想要的?

如果您想知道所有承诺何时完成(履行或拒绝),您可以使用 $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;
        }
    });
});