等待所有承诺解决 [英] Wait for all promises to resolve
问题描述
所以我有一种情况,我有多个未知长度的承诺链.我希望在处理完所有 CHAINS 后运行一些操作.这甚至可能吗?下面是一个例子:
So I have a situation where I have multiple promise chains of an unknown length. I want some action to run when all the CHAINS have been processed. Is that even possible? Here is an example:
app.controller('MainCtrl', function($scope, $q, $timeout) {
var one = $q.defer();
var two = $q.defer();
var three = $q.defer();
var all = $q.all([one.promise, two.promise, three.promise]);
all.then(allSuccess);
function success(data) {
console.log(data);
return data + "Chained";
}
function allSuccess(){
console.log("ALL PROMISES RESOLVED")
}
one.promise.then(success).then(success);
two.promise.then(success);
three.promise.then(success).then(success).then(success);
$timeout(function () {
one.resolve("one done");
}, Math.random() * 1000);
$timeout(function () {
two.resolve("two done");
}, Math.random() * 1000);
$timeout(function () {
three.resolve("three done");
}, Math.random() * 1000);
});
在这个例子中,我为承诺一、二和三设置了一个 $q.all()
,这些承诺将在某个随机时间得到解决.然后我将 promise 添加到 1 和 3 的末尾.我希望 all
在所有链都被解析后解析.这是我运行此代码时的输出:
In this example, I set up a $q.all()
for promises one, two, and three which will get resolved at some random time. I then add promises onto the ends of one and three. I want the all
to resolve when all the chains have been resolved. Here is the output when I run this code:
one done
one doneChained
two done
three done
ALL PROMISES RESOLVED
three doneChained
three doneChainedChained
有没有办法等待链解决?
Is there a way to wait for the chains to resolve?
推荐答案
我希望在解决所有链后解决所有问题.
I want the all to resolve when all the chains have been resolved.
当然,那么只需将每个链的承诺传递到 all()
而不是最初的承诺:
Sure, then just pass the promise of each chain into the all()
instead of the initial promises:
$q.all([one.promise, two.promise, three.promise]).then(function() {
console.log("ALL INITIAL PROMISES RESOLVED");
});
var onechain = one.promise.then(success).then(success),
twochain = two.promise.then(success),
threechain = three.promise.then(success).then(success).then(success);
$q.all([onechain, twochain, threechain]).then(function() {
console.log("ALL PROMISES RESOLVED");
});
这篇关于等待所有承诺解决的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!