Promise.allSettled 的替代方案

Alternative for Promise.allSettled

我目前正在使用 Promise.allSettled 等待我所有的承诺完成(无论它们是解决还是被拒绝)。

由于我的项目符合 Node v12.3.1 我无法使用它? 我还可以使用哪些其他简单的替代方法。

示例代码:

async function runner() {
    let promises = [];
    for(let i=0; i<10; i++) {
        promises.push(fetcher())
    }
    await Promise.allSettled(promises).then(([results]) => console.log(results.length));
    console.log('continue work...');
}

注意: Promise.allSettled 可从 Node version >12.9 获得。
添加垫片也不是一种选择。

您可以手动执行一个 polyfill 小技巧来模拟 Promise.allSettled 的效果。

这是片段。

if (!Promise.allSettled) {
  Promise.allSettled = promises =>
    Promise.all(
      promises.map((promise, i) =>
        promise
          .then(value => ({
            status: "fulfilled",
            value,
          }))
          .catch(reason => ({
            status: "rejected",
            reason,
          }))
      )
    );
}

Promise.allSettled(promises).then(console.log);

这意味着映射所有承诺,然后 return 结果,成功或被拒绝。

另一种选择,如果您不想要 Promise.all 的类对象性质,以下代码段可能会有所帮助。这很简单,你只需要在这里添加.catch方法。

const promises = [
  fetch('/something'),
  fetch('/something'),
  fetch('/something'),
].map(p => p.catch(e => e)); // this will prevent the promise from breaking out, but there will be no 'result-object', unlike the first solution.

await Promise.all(promises);

Returns 在所有给定的承诺都已实现或拒绝后解决的承诺,以及描述每个承诺结果的一系列对象。

图书馆: https://www.npmjs.com/package/promise-ax

示例:

const { createPromise } = require('promise-ax');
const promiseAx = createPromise();
const promise1 = Promise.resolve(4);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, new Error("error")));
const promise3 = Promise.reject("error");
const promise4 = promiseAx.resolve(8);
const promise5 = promiseAx.reject("errorAx");
const asyncOperation = (time) => {
    return new Promise((resolve, reject) => {
        if (time < 0) {
            reject("reject");
        }
        setTimeout(() => {
            resolve(time);
        }, time);
    });
};
const promisesToMake = [promise1, promise2, promise3, promise4, promise5, asyncOperation(100)];
promiseAx.allSettled(promisesToMake).then((results) =>   results.forEach((result) => console.log(result)));
// Salida esperada:
// 4
// Error: error
// error
// 8
// errorAx
// 100

您可以尝试这样的操作:

await (Promise as any).allSettled(promises).then(console.log);

这适用于打字稿。