Promise.all
是一个非常有用的 JavaScript 方法,它允许你并行执行多个 Promise,并在所有 Promise 都成功解析后返回一个包含所有解析值的数组。使用 await
关键字与 Promise.all
结合,可以使异步代码看起来更像同步代码,从而提高代码的可读性和简洁性。
Promise.all
会立即拒绝,并返回第一个被拒绝的 Promise 的错误信息。Promise.all
返回的是一个 Promise 对象。
假设我们有三个异步函数 fetchData1
, fetchData2
, 和 fetchData3
,它们都返回 Promise 对象。
async function fetchData1() {
// 模拟异步操作
return new Promise((resolve) => setTimeout(() => resolve('Data 1'), 1000));
}
async function fetchData2() {
// 模拟异步操作
return new Promise((resolve) => setTimeout(() => resolve('Data 2'), 1500));
}
async function fetchData3() {
// 模拟异步操作
return new Promise((resolve) => setTimeout(() => resolve('Data 3'), 500));
}
async function getAllData() {
try {
const [data1, data2, data3] = await Promise.all([
fetchData1(),
fetchData2(),
fetchData3()
]);
console.log(data1, data2, data3); // 输出: Data 1 Data 2 Data 3
} catch (error) {
console.error('Error fetching data:', error);
}
}
getAllData();
问题: 如果数组中的某个 Promise 被拒绝,Promise.all
会立即拒绝,并且不会等待其他 Promise 完成。
解决方法: 使用 Promise.allSettled
,它会等待所有 Promise 完成,无论它们是解析还是拒绝,并返回一个包含每个 Promise 结果的对象数组。
async function handleAllSettled() {
const results = await Promise.allSettled([
fetchData1(),
fetchData2(),
fetchData3()
]);
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`Promise ${index + 1} succeeded with value:`, result.value);
} else {
console.error(`Promise ${index + 1} failed with reason:`, result.reason);
}
});
}
handleAllSettled();
通过这种方式,即使某些 Promise 失败,你仍然可以处理其他成功的结果。
领取专属 10元无门槛券
手把手带您无忧上云