一个健壮的通用异步请求库需封装fetch,分层捕获网络错误、HTTP状态码异常、JSON解析失败、超时与取消,并支持请求/响应/错误拦截器及语义化API。

要编写一个具备完整错误捕获机制的通用异步请求库,核心在于统一处理网络异常、HTTP 状态码错误、JSON 解析失败、超时、取消请求等常见问题,并提供可扩展的拦截器与友好的 API。下面是一个轻量但健壮的实现思路和示例代码。
封装 fetch 并统一错误分类
不直接暴露原始 fetch,而是封装成返回 Promise 的函数,对所有可能出错环节做分层捕获:
- 网络层错误(如 DNS 失败、连接中断)——fetch 本身会 reject,用 try/catch 捕获
- HTTP 状态码非 2xx/3xx ——手动检查 response.ok 或 response.status,抛出自定义错误
- 响应体解析失败(如非 JSON)——response.json() 可能 reject,需再次 catch
- 业务逻辑错误(如后端返回 { code: 40001, msg: "token 过期" })——在解析成功后根据约定字段二次判断,统一 throw
支持超时与 AbortController 取消
原生 fetch 不支持 timeout,必须借助 AbortController 实现可控中断:
- 创建 AbortController 实例,将其 signal 传入 fetch 选项
- 用 setTimeout 在指定毫秒后调用 controller.abort()
- 捕获 AbortError(注意:不同浏览器错误名略有差异,建议检查 err.name === 'AbortError' 或 err.name === 'TypeError' && /cancel/i.test(err.message))
提供请求/响应拦截器与错误统一处理钩子
类似 Axios 的拦截能力,让开发者能注入日志、鉴权头、错误弹窗、自动重试等逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- request interceptor:修改配置(如添加 token、设置默认 baseURL)
- response interceptor:预处理响应数据,或对特定 status/code 做全局响应(如跳登录页)
- error interceptor:集中处理所有请求错误,区分网络错误、业务错误、超时等,避免每个调用点重复写 toast 或 log
拦截器用数组存储,按顺序执行;错误拦截器应能接收原始 error 和请求配置,便于上下文判断。
导出语义化方法并保持链式可读性
对外暴露 request()(通用)、get()/post()/put()/delete()(快捷),所有方法返回 Promise,并支持 async/await:
- 每个方法内部复用同一套执行逻辑,避免重复错误处理代码
- 支持传入 options(含 headers、timeout、signal、validateStatus、transformResponse 等)
- 错误实例建议继承 Error,添加 .code(如 'NETWORK_ERROR'、'TIMEOUT'、'VALIDATION_FAILED')、.config、.response、.request 等属性,方便调试和分类处理
不复杂但容易忽略的是:错误边界要清晰,不要把网络错误和业务错误混为一谈;拦截器执行顺序和错误穿透逻辑要明确;取消请求后不应再 resolve 或 reject 已废弃的 Promise。做好这几点,就能构建出稳定、易维护、可观察的异步请求基础能力。

















