async/await 通过线性代码拉直异步链式调用,核心在于拆分、控制与稳定:串行依赖用多个 await 按需等待;错误隔离需分段 try/catch 或 .catch();并行任务用 Promise.all() 或 allSettled();防重复需节流、缓存与 AbortController。

直接用 await 一层层等下去,不是“深度嵌套”的解法,而是让它看起来不嵌套——async/await 的本质,就是把异步链式调用“拉直”成同步风格的线性代码。关键不在“怎么嵌”,而在“怎么拆、怎么控、怎么稳”。
串行依赖:按顺序等,但别写成回调套娃
当后一步必须依赖前一步结果(比如先查用户,再查该用户的订单,再查订单详情),就用多个 await 按需等待,逻辑清晰、可读性强:
- 每个
await后面接一个返回 Promise 的函数,比如fetchUser()、fetchOrders(userId) - 变量直接赋值,后续步骤自然可用,不用塞进回调里
- 避免手动 new Promise + resolve/reject 包裹,已有 Promise 就直接 await
错误隔离:每个关键步骤单独捕获,别全堆在最后
深度依赖链中,某一步失败不该让整个流程静默中断或抛到顶层——要分段容错:
- 用
try/catch包住单个await,比如获取用户失败时返回默认值或提前退出 - 也可以对 Promise 调用
.catch(),让错误处理和主逻辑分离,例如:const user = await fetchUser(id).catch(() => null); - 避免只在最外层加一个
try/catch,否则无法区分是哪一步出错,调试困难
并行与混合:不所有步骤都得串着等
如果某些子任务彼此无关(比如同时加载用户信息和用户头像),就别强行串行——用 Promise.all() 并发发起:
- 先收集所有 Promise:
const [user, avatar, stats] = await Promise.all([fetchUser(), fetchAvatar(), fetchStats()]); - 混合场景下,可先串行获取主数据,再并行拉取附属资源,提升整体响应速度
- 注意:并行请求失败会全部中断,如需部分失败仍继续,可用
Promise.allSettled()
防重复与状态控制:嵌套深处更要管住执行节奏
深度调用链容易因用户多次触发、组件重复挂载等导致重复请求——需要主动节流或缓存:
- 加简单标记位,比如请求开始设
isLoading = true,结束才重置 - 对相同参数的请求做记忆化(memoize),避免重复调用同一接口
- 必要时用
AbortController主动取消已过期的请求,尤其在页面切换或输入频繁时


















