按照当前行为,Promise.all()方法返回一个Promise,当作为可迭代对象传递的所有promise已解决或当可迭代对象不包含promise时,该Promise进行解析。它拒绝了第一个承诺被拒绝的原因。
例如:
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
当前,我正在尝试实现类似于promise.all
(例如promise.sequenceAll
)的 polyfill ,其中将第一个承诺的结果馈送到下一个承诺
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.sequenceAll([promise1, promise2, promise3]).then(function(values) {
console.log(values);
});
预期的输出:promise1的结果将作为参数传递给promise2。如果任何承诺被拒绝,它将执行promise.catch();
答案 0 :(得分:0)
您可以执行此操作,并从.then()
处理程序返回第一个承诺的已解决值,这将使它成为最终承诺的已解决值:
Promise.all([promise1, promise2, promise3]).then(([v1]) => {
// make the resolved value of the first promise be the resolved value
// of the subsequent promise
return v1;
}).then((value) => {
// v1 is now the resolved value of the chain
console.log(value);
});
您可以将该行为封装在所需的函数中,尽管在需要此行为时,只需在现有的.then()
上添加一个Promise.all()
处理函数即可。
答案 1 :(得分:-2)
似乎promise.pipe正是您所需要的
https://www.npmjs.com/package/promise.pip
可悲的是,我现在没有能力检查,但是使用Array.reduce()似乎有可能,请看一下这篇文章: https://css-tricks.com/why-using-reduce-to-sequentially-resolve-promises-works/ 他们至少能够顺序执行它们。