有什么方法可以自定义promise.all吗?

时间:2019-07-19 03:04:24

标签: javascript ecmascript-6 promise es6-promise

按照当前行为,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();

2 个答案:

答案 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/ 他们至少能够顺序执行它们。