有没有用过 Promise.allSettled ()?它是干什么的?
介绍如何使用 Promise.allSettled () 处理多个异步操作的结果,确保所有请求的完成状态都被捕获。
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 调用并行执行)以实现高效错误分析或无阻挡操作流。