async/await 与 promise.all 配合可实现高效并发请求,推荐写法为 await promise.all([...]),结果有序且错误统一捕获;需容错时用 promise.allsettled,需限流时可用 p-limit 等工具。

async/await 本身是 Promise 的语法糖,而 Promise.all 是处理多个 Promise 并发执行的核心工具。二者配合使用,既能保持代码可读性,又能真正发挥并发请求的效率优势。
用 async/await 包裹 Promise.all,让并发请求“等结果”更自然
直接 await Promise.all([...]) 是最常见也最推荐的方式。它会等待所有请求完成(或任一失败),返回一个按顺序排列的结果数组。
- 写法简洁:不用嵌套 .then,错误统一用 try/catch 捕获
- 结果有序:即使请求响应快慢不同,数组索引仍对应原始请求顺序
- 失败即中断:只要一个请求 reject,整个 Promise.all 就 reject,适合强一致性场景
示例:
async function fetchUsers() {
const urls = [
'/api/users/1',
'/api/users/2',
'/api/users/3'
];
try {
const responses = await Promise.all(
urls.map(url => fetch(url))
);
const users = await Promise.all(
responses.map(res => res.json())
);
return users;
} catch (err) {
console.error('批量请求失败', err);
}
}
避免常见陷阱:别在 map 里混用 await
下面这种写法看似用了 async/await,实则变成串行请求,完全失去并发意义:
// ❌ 错误:await 在箭头函数内部,map 返回的是 Promise[],但 await 被逐个执行
const users = await urls.map(async url => {
const res = await fetch(url); // 这里会一个接一个等
return res.json();
});
正确做法是:先用 map 生成 Promise 数组,再用 Promise.all 统一 await。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
需要容错?用 Promise.allSettled 替代 Promise.all
如果某几个请求失败不影响整体,希望拿到全部结果(包括 fulfilled/rejected 状态),就该用 Promise.allSettled:
- 始终 resolve,返回每个 Promise 的 { status, value | reason }
- 适合日志上报、批量导入、非关键接口聚合等场景
示例:
async function fetchWithFallback() {
const promises = urls.map(url =>
fetch(url).then(r => r.json()).catch(err => ({ error: err.message }))
);
const results = await Promise.allSettled(promises);
return results.map(r => r.status === 'fulfilled' ? r.value : r.reason);
}
控制并发数量?手动分批 + 递归或使用 p-limit
Promise.all 默认“全量并发”,对后端压力大。如需限制同时最多 5 个请求,可:
- 手写分块逻辑:把长数组切片,逐批 await Promise.all
- 用成熟库如
p-limit:轻量、可靠、API 清晰
使用 p-limit 示例:
import pLimit from 'p-limit';
async function fetchLimited(urls) {
const limit = pLimit(5);
const promises = urls.map(url => limit(() => fetch(url).then(r => r.json())));
return Promise.all(promises);
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










