我变得动态(承诺的数量可以在每个运行时更改)承诺数组,现在我希望在每次解决或拒绝后 在承诺数组完成之前处理返回的承诺。
我尝试承诺所有,但在所有承诺完成后它会继续。
如果数组(承诺)不是动态的,那么我可以简单地使用这样的东西 但是我不知道我在阵中有多少承诺,我希望在履行每一个承诺之后或......继续回答它并且不要等到所有承诺都完成
firstMethod()
.then(secondMethod)
.then(thirdMethod);
我们正在使用Q ...
有可能吗?
更新(示例)
让我说我有诺言阵列
[promise1,promise2,promise3, promiseN]
现在我想要promise1
完成处理以使用然后处理它,而不是等待所有承诺都完成。
这里最大的问题是数组可以有N个承诺,我不知道在RT中我会得到多少承诺,直到我得到这个数组因此我不能简单地使用
更新2 (澄清一点:-))棘手的部分......
如果我事先知道数组的大小我可以简单地使用,然后在数组5链中使用5个条目但是这里棘手的部分是我事先不知道我将在promises数组中有多少承诺....
答案 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)
});