async/await 将 fetch 的 Promise 链转为线性代码,提升可读性与可维护性:顺序请求自然展开、并发用 Promise.all + await、封装统一处理 response.ok 和 JSON 解析、错误分网络层与 HTTP 层处理。

用 async/await 写 fetch,能把嵌套的 Promise 链变成接近同步的线性代码,读起来更直觉、改起来更安全。关键不是“省几行代码”,而是让数据流向清晰、错误边界明确、依赖关系一目了然。
顺序请求:像写同步代码一样串起依赖链
比如先查用户,再用用户 ID 查订单,最后查商品详情——传统 .then() 容易缩进失控,而 await 让每一步自然展开:
- 每个 fetch 后直接 await 得到 Response,不嵌套
- 紧接着 await response.json() 解析数据,中间可插逻辑(如判断空数组)
- 出错时统一由 try/catch 捕获,不用每个 .then().catch()
并发请求:用 Promise.all + await 同时发起无依赖操作
当多个请求互不依赖(如拉取用户信息、未读消息数、系统通知),串行会拖慢体验。并发写法简单高效:
- 把多个 fetch 调用放进 Promise.all([...])
- await Promise.all(...) 等待全部响应返回(注意:任一失败则整体 reject)
- 再分别 await 各个 response.json(),避免在 all 里提前解析
- 需要容错可用 Promise.allSettled 替代
封装通用请求函数:避免重复写 response.ok 判断
每次手动 if (!response.ok) throw ... 很啰嗦,也容易漏。封装一层后,业务代码只关注“要什么”,不操心“怎么验”:
- 函数默认检查 response.ok,失败自动抛错,带 status 和 url 信息
- 支持传入 method、headers、body,并自动处理 JSON.stringify
- 可选解析方式:.json() 是默认,也可支持 .text() 或 .blob()
- 后续加超时、取消、重试等能力,也只需改这一处
错误处理:网络异常和 HTTP 错误要分开对待
fetch 的“成功”仅表示请求发出去并收到响应,404、500 不会自动 reject。所以必须分两层处理:
- 外层 try/catch 捕获网络级错误(断网、DNS 失败、AbortError)
- 内层检查 response.ok 或 response.status,处理业务级 HTTP 异常
- 自定义错误对象建议带上 status、url、message,方便调试和监控


















