获得第一个履行承诺

mba*_*ski 6 javascript node.js promise es6-promise

如果我有两个承诺A和B,其中只有一个会成功,我怎样才能获得成功完成的任何承诺?我正在寻找类似的东西Promise.race,但它将只返回履行的第一个承诺.我正在使用ES6的承诺.

小智 14

Promise.all颠倒承诺的极性,然后你可以使用,因为它拒绝了第一个被拒绝的承诺,它在反转后对应于第一个履行的承诺:

const invert  = p  => new Promise((res, rej) => p.then(rej, res));
const firstOf = ps => invert(Promise.all(ps.map(invert)));

// Utility routines used only in testing.
const wait    = ms => new Promise(res => setTimeout(() => res(ms), ms));
const fail    = f  => Promise.reject(f);
const log     = p  => p.then(v => console.log("pass", v), v => console.log("fail", v));

// Test.
log(firstOf([wait(1000), wait(500) ]));
log(firstOf([wait(1000), fail("f1")]));
log(firstOf([fail("f1"), fail("f2")]));
Run Code Online (Sandbox Code Playgroud)

这将返回第一个履行承诺的值,或者如果全部拒绝,则返回一系列拒绝原因.

  • 聪明的。这不是反转的概念第一次在承诺领域发挥作用。 (2认同)

t_d*_*m93 8

ES2021 / ES12 - Promise.any

Promise.any- 最先履行的承诺获胜。

const promiseA = Promise.reject();
const promiseB = new Promise((resolve) => setTimeout(resolve, 100, 'succeed'));

const promises = [promiseA, promiseB];


Promise.race(promises).then((value) => console.log(value)); // rejected promise

Promise.any(promises).then((value) => console.log(value)); // "succeed"
Run Code Online (Sandbox Code Playgroud)

请注意,any忽略第一个被拒绝的承诺 -promiseA因为promiseB正在解决

如果所有给定的 Promise 都被拒绝,则返回的 Promise 也被拒绝。


这是已完成的提案,计划在 ES2021 上发布(预计于 2021 年 6 月发布)