async/await 默认串行,性能提升关键在于识别可并发请求并合理组合promise;应优先并行独立请求、限制高并发数、拆分混合流程、减少轻量async函数开销。

async/await 本身不会自动并行,写成连续 await 就是串行执行——这是性能损耗的主因。真正提升效率的关键,在于识别哪些请求可以并发、哪些必须等待,并用合适的方式组合 Promise。
识别可并行的独立请求
如果多个请求之间没有数据依赖,就绝不该用 await 一个接一个等。比如获取用户信息和商品列表,彼此无关,应同时发起。
- 错误写法(串行,总耗时 ≈ A + B):
const user = await fetchUser();
const products = await fetchProducts(); - 正确写法(并行,总耗时 ≈ max(A, B)):
const [user, products] = await Promise.all([fetchUser(), fetchProducts()]);
控制高并发下的请求数量
不是所有场景都适合无限制并发。大量同时请求可能压垮后端、触发限流,或耗尽浏览器连接数(Chrome 默认同域最多6个并发连接)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 asyncPool 限制最大并发数,例如只允许同时发 3 个请求:
const results = await asyncPool(3, urls, url => fetch(url).then(r => r.json())); - 原理是维护一个运行中任务数组和等待队列,任一任务完成就立即启动下一个,确保峰值稳定。
混合流程:部分并行 + 部分串行
真实业务常有“先取配置 → 再根据配置发多个请求”这类结构。这时要拆开逻辑,避免把所有 await 堆在一起。
- 先并发获取基础数据:
const [config, auth] = await Promise.all([fetchConfig(), fetchAuth()]); - 再基于 config 并发发起后续请求:
const ids = config.supportedIds;
const items = await Promise.all(ids.map(id => fetchItem(id, auth.token)));
减少状态机开销,避免过度切分
每个 async 函数都会生成状态机,频繁调用轻量级 async 函数(如包装单个 fetch)会带来额外开销。
- 对简单、高频操作,可考虑直接返回 Promise,不套 async:
const fetchUser = () => fetch('/api/user').then(r => r.json()); - 需要统一错误处理或日志时,再封装为 async 函数,保持粒度合理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










