动态数组承诺序列

Dynamic array promise sequence

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

我尝试使用 promise all 但在所有 promise 完成后它仍在继续。

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

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

我们正在使用 Q ...

可能吗?

更新(示例)

假设我有 promise 数组

[promise1,promise2,promise3, promiseN]

现在我希望当 promise1 完成处理时用 然后 处理它,而不是等待所有承诺都完成。

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

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

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

如果您不需要连锁承诺。你可以这样做:

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

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

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

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

如果promise结果最后要拼接在一起,数组可以额外处理all:

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

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

大多数 promise 实现都是如此。可能有 Q 方法可以更轻松地做到这一点。

你可以使用Promise.race()

The Promise.race(iterable) method returns a promise that resolves or rejects as soon as one of the promises in the iterable resolves or rejects, with the value or reason from that 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
});