等待所有解决的正确方法
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;
}
});
});
我需要等到所有承诺都已解决或被拒绝,然后才执行回调。似乎 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;
}
});
});