有没有用过 Promise.allSettled ()?它是干什么的?

介绍如何使用 Promise.allSettled () 处理多个异步操作的结果,确保所有请求的完成状态都被捕获。

异步编程 中等 Promise JavaScript ES2020

Promise.allSettled() 是JavaScript 中用于处理并发异步操作的一个静态方法,属于ES2020 (ES11) 引入的标准特性。它接受一个 Promise 对象数组作为参数,并在所有输入 Promise 完成后(无论是fulfilled 还是rejected)返回一个包含所有结果的数组。

主要功能和特点

  • 等待所有 Promise 完成:不会因单一 Promise 被拒绝(rejected)而终止整个操作。
  • 返回统一结构:每个 Promise 的结果被解析为一个对象,该对象包含 status 属性和 value/reason 属性。常见 status 有:
    • "fulfilled":表示操作成功,value 包含值。
    • "rejected":表示操作失败,reason 包含错误原因。

示例代码和用法

假设我们有三个 Promise:两个成功 resolve,一个被 reject。

const promise1 = new Promise((resolve) => setTimeout(resolve, 100, '成功1'));
const promise2 = new Promise((reject) => setTimeout(reject, 200, '失败2'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 300, '成功3'));

Promise.allSettled([promise1, promise2, promise3])
  .then((results) => {
    results.forEach((result) => {
      if (result.status === 'fulfilled') {
        console.log(`Fulfilled: ${result.value}`);
      } else if (result.status === 'rejected') {
        console.log(`Rejected: ${result.reason}`);
      }
    });
  });

这段代码的输出将是:

Fulfilled: 成功1
Rejected: 失败2
Fulfilled: 成功3

典型应用场景

  • 需要汇总多个异步任务的结果时(e.g., 多个网络请求、文件读取并行执行,无论成败)。
  • 在调试或分析数据中,完整捕获所有操作状态。
  • Promise.all() 对比:后者遇一 rejection 则整体失败;allSettled() 确保完全报告。

核心注意事项

  • 异步编程的核心能力:增强异常恢复机制,避免单个异常导致全局处理中断。
  • 前端开发:常用于处理批量请求(如多个 API 调用并行执行)以实现高效错误分析或无阻挡操作流。