动态数组承诺序列

时间:2017-02-14 11:27:07

标签: javascript node.js ecmascript-6 promise q

我变得动态(承诺的数量可以在每个运行时更改)承诺数组,现在我希望在每次解决或拒绝后 在承诺数组完成之前处理返回的承诺

我尝试承诺所有,但在所有承诺完成后它会继续。

如果数组(承诺)不是动态的,那么我可以简单地使用这样的东西 但是我不知道我在阵中有多少承诺,我希望在履行每一个承诺之后或......继续回答它并且不要等到所有承诺都完成

firstMethod()
   .then(secondMethod)
   .then(thirdMethod);

我们正在使用Q ...

有可能吗?

更新(示例)

让我说我有诺言阵列

[promise1,promise2,promise3, promiseN]

现在我想要promise1完成处理以使用然后处理它,而不是等待所有承诺都完成。

这里最大的问题是数组可以有N个承诺,我不知道在RT中我会得到多少承诺,直到我得到这个数组因此我不能简单地使用

更新2 (澄清一点:-))棘手的部分......

如果我事先知道数组的大小我可以简单地使用,然后在数组5链中使用5个条目但是这里棘手的部分是我事先不知道我将在promises数组中有多少承诺....

3 个答案:

答案 0 :(得分:2)

如果目标是使用相同的then链接每个承诺,但不等待所有承诺完成,这只是一个循环:

for (const promise of promiseArray) {
  promise.then(...)
}

如果最终应将promise结果连接在一起,则all可以另外处理该数组:

Promise.all(promiseArray.map(promise => promise.then(...)))
.then(...)

请注意all的行为适用于此处。如果promise数组中有未被拒绝的拒绝,则只会捕获第一个拒绝。

大多数承诺实施都是如此。可能有Q方法可以更容易地做到这一点。

答案 1 :(得分:1)

您可以使用Promise.race()

  

Promise.race(iterable)方法返回一个promise,它会在iterable中的一个promise中解析或拒绝,并使用该promise中的值或原因解析或拒绝。

var p1 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 500, 'one'); 
});
var p2 = new Promise(function(resolve, reject) { 
    setTimeout(resolve, 100, 'two'); 
});

Promise.race([p1, p2]).then(function(value) {
  console.log(value); // "two"
  // Both resolve, but p2 is faster
});

答案 2 :(得分:0)

如果您不需要链接承诺。你可以这么做:

var tasks = [[promise1, handler1], [promise2, handler2], [promise3, handler3]];

tasks.forEach(function (task) {
  var promise = task[0];
  var handler = task[1];
  promise.then(handler)
});