定义:
Promise.allSettled
是一个方法,它允许你同时处理多个 promise,并获得每个 promise 的结果,无论它是 resolve 还是 reject。它返回一个带有一组 promise 处理结果数组的被 fulfill 的 promise。
Promise.allSettled() 是:
- 该方法允许你同时处理多个 promise
- 获得每个 promise 的结果,无论它是 resolve 还是 reject
- 与Promise.all
不同,如果数组中任何一个 promise reject,Promise.all
会立即 reject
- 返回一个带有 promise 处理结果数组的被 fulfill 的 promise
Promise.allSettled() 方法的语法:
Promise.allSettled(iterable);
*iterable
包含了 promises。
示例:
Promise.allSettled([
Promise.resolve(33),
new Promise(resolve => setTimeout(() => resolve(66), 0)),
99,
Promise.reject(new Error("an error")),
]).then(values => console.log(values));
// [
// { status: 'fulfilled', value: 33 },
// { status: 'fulfilled', value: 66 },
// { status: 'fulfilled', value: 99 },
// { status: 'rejected', reason: Error: an error }
// ]
当你有多个不依赖于彼此成功完成的异步任务,或者你总是想知道每个 promise 的结果时,通常会使用 Promise.allSettled()
。Promise.allSettled()
返回一个待处理的 promise,它会在每个输入的 promise 都已处理后异步完成。
Promise.allSettled()
方法返回一个 promise,该 promise 会解析成一个数组,数组中是每个输入 promise 结果的对象描述。
Promise.allSettled() vs Promise.all()
当你想等待多个 promise 完成并获得所有解析值的数组时,Promise.all()
非常有用。
**注:如果任何 promise 被 reject,整个 Promise.all()
会立即 reject。**
Promise.allSettled()
的工作机制与 Promise.all()
类似,但是不是在任何 promise reject 时立即 reject,而是**等待**所有 promise 处理完成(resolve 或 reject)后再返回每个 promise 的状态和值/原因的对象数组。
结论
以下是一些 Promise.allSettled
可能有用的场景:
1. 收集多个 API 请求的结果:如果你需要发出多个 API 请求并希望单独处理每个响应,无论任何请求是否失败,你都可以使用 Promise.allSettled
同时执行所有请求并获取结果。
2. 异步任务的批量处理:如果你有一批相互独立的异步任务要并发执行,并且你需要分别知道每个任务的结果,Promise.allSettled
可以帮助你收集每个任务的结果。
3. 错误处理和优雅降级:如果你有一些对整个应用程序流程不关键的异步操作列表,无论成功或者失败,你都希望在不中断其他任务执行的情况下处理它们,那么 Promise.allSettled
是很有用的选择。