Q.all带有链式序列

时间:2014-11-13 23:08:36

标签: javascript promise q

我使用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/

2 个答案:

答案 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”使得每个承诺都可以在链中执行,换句话说,就是承诺的序列