在 async 函数中配合 promise.all 实现并行请求,核心做法是先将所有异步操作(如网络请求)转换为 promise 对象并放入数组,然后使用 await 等待该数组完成。这样做能确保多个请求同时发起,而不是串行执行,从而显著缩短总耗时。

如何避免串行请求导致的性能瓶颈
如果在循环中直接使用 await,会导致请求一个接一个地执行,总时间等于各请求耗时之和。要避免这种情况,必须在进入循环前或循环内部先收集所有 Promise,再统一等待。

const urls = ['https://api.example.com/1', 'https://api.example.com/2'];
async function fetchParallel() {
// 错误示范:串行执行,总耗时 = t1 + t2
// for (const url of urls) {
// const data = await fetch(url);
// }
// 正确做法:并行执行,总耗时 = max(t1, t2)
const promises = urls.map(url => fetch(url));
const responses = await Promise.all(promises);
return responses.map(res => res.json());
}
上述代码中,urls.map 会立即创建两个 fetch 调用,它们几乎同时发出。只有当所有请求都返回后,await Promise.all 才会继续执行后续逻辑。这种模式适用于各个请求之间没有依赖关系的场景。
如何处理并行请求中的单个失败情况
Promise.all 具有“短路”特性:只要有一个 Promise 被拒绝(reject),整个 Promise.all 就会立即拒绝,导致其他成功的数据也被丢弃。如果需要容忍部分失败,应改用 Promise.allSettled。

async function fetchWithFallback() {
const urls = ['https://api.example.com/valid', 'https://api.example.com/invalid'];
// 使用 allSettled 捕获每个请求的状态
const results = await Promise.allSettled(
urls.map(url => fetch(url).then(r => r.json()).catch(err => ({ error: err.message })))
);
// 过滤出成功的结果
const successData = results
.filter(result => result.status === 'fulfilled')
.map(result => result.value);
console.log('成功数据:', successData);
}
在这个例子中,即使第二个 URL 请求失败,程序也不会崩溃,而是通过 allSettled 获取每个请求的最终状态。开发者可以遍历结果数组,单独处理每个成功或失败的项,从而实现更健壮的并行请求逻辑。
基于 Promise.allSettled 结果的具体数据处理问题
在使用 Promise.allSettled 后,返回的数组元素包含 status 和 value 或 reason 属性。具体而言,成功时 status 为 'fulfilled',其 value 即为实际数据;失败时 status 为 'rejected',其 reason 为错误对象。理解这一结构是正确处理混合结果的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











