async/await本身不提升异步效率,关键在于用promise.all将无关请求从串行转为并发;串行await总耗时≈各请求之和,并行则≈最长单个耗时;需避免单独await、for循环await及假并行。

async/await 本身不改变异步操作的执行方式,它只是让 Promise 的使用更直观;真正提升效率的关键,在于用对 Promise.all —— 把本可并行的请求从串行“拉平”为并发。
为什么 await 串行会拖慢整体速度
每个 await 都会让后续代码暂停,直到当前 Promise 完成。如果多个请求彼此无关(比如同时拉取用户信息、权限列表、配置项),串行等待意味着总耗时 ≈ 各请求耗时之和。
例如:
- fetchUser() 耗时 300ms
- fetchRoles() 耗时 250ms
- fetchConfig() 耗时 200ms
串行写法:300 + 250 + 200 = 750ms(实际可能更长,含网络排队)
并行写法:≈ 最长那个请求的时间,即约 300ms。
正确写法:await Promise.all([...])
把多个独立的异步调用放进 Promise.all,再用 await 等待整个数组完成。结果按传入顺序返回,一一对应。
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
async function loadDashboardData() {
const [user, roles, config] = await Promise.all([
fetchUser(),
fetchRoles(),
fetchConfig()
]);
return { user, roles, config };
}
注意:
- 不要对每个调用单独加 await
- 不要用 for 循环 + await(那仍是串行)
- Promise.all 任一失败会导致整体 reject,如需容错,可包装单个 Promise 或改用 Promise.allSettled()
需要顺序执行时,别硬套 Promise.all
如果后一个请求依赖前一个的结果(比如先登录再拿 token 请求用户详情),就不能并行。此时应保留 await 逐个调用:
async function loginAndFetchProfile() {
const loginRes = await login(credentials);
const profile = await fetchProfile(loginRes.token); // 必须等 loginRes
return profile;
}
强行用 Promise.all 会报错或返回 undefined,因为第二个请求缺少必要参数。
进阶提示:避免“假并行”
以下写法看似并行,实则无效:
async function badExample() {
fetchUser(); // 没 await,没接返回值
fetchRoles(); // 启动但被丢弃
fetchConfig();
return 'done'; // 函数立刻返回,请求还在后台跑
}
这既没等结果,也无法处理错误,属于失控调用。Promise.all 是明确声明“我要等这一组全部完成”的语义表达。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










