动态数组承诺序列
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
});
我正在获得动态的(每个运行时可以更改承诺的数量)承诺数组,现在我希望在每次解决或拒绝之后 处理返回的承诺 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
});