【问题标题】:Is there any way to customise promise.all?有没有办法自定义promise.all?
【发布时间】:2019-11-28 00:09:30
【问题描述】:

根据当前的行为,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"]

目前,我正在尝试实现类似于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 被拒绝,那么它将执行 promise.catch();

【问题讨论】:

  • 听起来你需要像 RamdaJS (ramdajs.com) 这样的东西。 “[Ramda] 使得将函数构建为更简单函数的序列变得非常容易,每个函数都转换数据并将其传递给下一个。Ramda 旨在支持这种编码风格”。关于如何在 promise2 中使用 promise1 的结果,您有更具体的场景吗?
  • 我想为此创建一个 polyfill。我无法使用任何第三方库。
  • The result of promise1 will be passed to the promise2 as an argument. 什么的参数? promise2 不是函数!
  • 是的,在这种情况下,promise2 不是一个函数,所以它会跳过它,并将相同的参数传递给 promise3。基本上,它应该有一个 (typeof name === 'function' ) 检查。
  • @SaswatArabinda promise3 不是函数...

标签: javascript ecmascript-6 promise es6-promise


【解决方案1】:

您可以这样做并从.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() 上即可。

【讨论】:

  • 默认情况下,promise.all 将有一个 then 方法。所以你不能链接它。如何做到这一点?
  • @SaswatArabinda - 我不知道那条评论是什么意思。你可以做Promise.all().then(...).then(...).then(...)。每个.then() 返回一个新的promise,它可以做任何普通promise 可以做的任何事情。前一个.then() 的返回值成为链中下一个.then() 的解析值。这就是 promises 链的方式。 Promise.all() 只是返回一个正常的承诺,它像所有的人一样连锁。与 Promise.all() 唯一不同的是,它的解析值是一个值数组(您可以使用任何 promise 手动完成)。
  • 非常感谢您的快速回复
  • @SaswatArabinda - 如果这回答了您的问题,您可以通过单击答案左侧的复选标记向社区表明这一点,这也将为您在此处获得一些声誉积分以遵循正确的程序。
  • 我没有这样做的声誉
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2016-09-13
  • 2021-11-24
相关资源
最近更新 更多