我使用Q.js,并且有一系列函数返回与随后的回调链接在一起的promises,因为,我需要它们按顺序as a sequence执行。
var promiseOne = one();
promiseOne.then(two).then(three).done();
我也有一些可以随时发生的承诺。我需要知道什么时候他们已经解决了所有问题 - 包括最后一个然后在承诺链中回拨。我试图使用Q.all.then但它会在达到一些承诺之前达到Q.all's -
Q.all([promiseOne, anotherPromise]).then(function(results) {
// will hit this before chain above is done
});
在我的jsfiddle示例中,我在Q.all中只有一个承诺,但实际上它是众多之一。有没有什么方法可以让我知道什么,当包括链接在内的所有内容都解决了?
jsfiddle:http://jsfiddle.net/98rq0bs6/1/
答案 0 :(得分:2)
承诺不知道链接到它的是什么。但是,调用.then()
会返回一个新的承诺,它会知道它是从哪个链接起来的。您需要接受这个代表链式操作结果的新承诺,并等待它 - 而不是promiseOne
,这只是链中的第一个链接。
var promiseOne = one();
var promiseChain = promiseOne.then(two).then(three);
Q.all([promiseChain, anotherPromise]).then(function(results) {
// ^^^^^^^^^^^^ wait for the chain
…
}).done();
答案 1 :(得分:0)
var listOfItems = [1, 2, 3, 4, 5];
// Creating an empty initial promise that always resolves itself.
var promise = $q.all([]);
// Iterating list of items.
angular.forEach(listOfItems, function (item) {
promise = promise.then(function () {
return $timeout(function () {
console.log('Item executed: ' + item);
}, 2000);
});
});
promise.finally(function () {
console.log('Chain finished!');
});
Source,在这个解决方案中,“angular.forEach”使得每个承诺都可以在链中执行,换句话说,就是承诺的序列