首页 > 解决方案 > 有没有办法自定义promise.all?

问题描述

根据当前的行为,Promise.all() 方法返回一个单一的 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"]

目前,我正在尝试实现类似于(Like, ) 的polyfill ,其中第一个承诺的结果将被提供给下一个承诺。promise.allpromise.sequenceAll

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 被拒绝,那么它将执行promise.catch();

标签: javascriptecmascript-6promisees6-promise

解决方案


您可以这样做并从处理程序返回第一个承诺的已解决值,.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()


推荐阅读