推荐答案
Promise.allSettled 是 ECMAScript 2020 引入的一个静态方法,用于处理多个 Promise 对象。它接收一个 Promise 对象数组作为参数,并返回一个新的 Promise 对象。这个新的 Promise 对象在所有输入的 Promise 对象都已完成(无论是成功还是失败)时才会被解决。返回的 Promise 对象的结果是一个数组,数组中的每个元素都是一个对象,表示对应输入 Promise 的最终状态(fulfilled 或 rejected)及其值或原因。
本题详细解读
1. 基本用法
// www.javascriptcn.com code example
const promises = [
Promise.resolve(1),
Promise.reject('Error occurred'),
Promise.resolve(3)
];
Promise.allSettled(promises)
.then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('Fulfilled:', result.value);
} else {
console.log('Rejected:', result.reason);
}
});
});2. 返回值
Promise.allSettled 返回的 Promise 对象的结果是一个数组,数组中的每个元素都是一个对象,包含以下属性:
status: 表示 Promise 的最终状态,可以是'fulfilled'或'rejected'。value: 如果状态为'fulfilled',则此属性包含 Promise 的解决值。reason: 如果状态为'rejected',则此属性包含 Promise 被拒绝的原因。
3. 与 Promise.all 的区别
Promise.all: 只有当所有输入的 Promise 都成功解决时,返回的 Promise 才会被解决。如果任何一个 Promise 被拒绝,返回的 Promise 会立即被拒绝,并且不会等待其他 Promise 的结果。Promise.allSettled: 无论输入的 Promise 是成功还是失败,返回的 Promise 都会在所有输入的 Promise 完成后被解决。它不会因为某个 Promise 被拒绝而提前结束。
4. 适用场景
Promise.allSettled 适用于需要处理多个异步操作,并且希望在所有操作都完成后(无论成功或失败)再进行下一步处理的场景。例如,批量请求多个 API,并且需要知道每个请求的最终结果时,可以使用 Promise.allSettled。
5. 示例
// www.javascriptcn.com code example
const apiRequests = [
fetch('/api/data1'),
fetch('/api/data2'),
fetch('/api/data3')
];
Promise.allSettled(apiRequests)
.then(results => {
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`Request ${index + 1} succeeded:`, result.value);
} else {
console.log(`Request ${index + 1} failed:`, result.reason);
}
});
});在这个示例中,无论每个 API 请求是否成功,Promise.allSettled 都会在所有请求完成后返回结果,并允许你根据每个请求的状态进行相应的处理。