fetch 本身不支持直接设置超时,需通过 abortcontroller 结合 settimeout 实现:创建 controller 并传 signal 给 fetch,超时调 abort() 中断请求;封装函数接收 url、options、timeout,内部处理 abort 和错误捕获;需判断 error.name === 'aborterror' 区分超时与网络错误;注意 abortcontroller 兼容性及 signal 不可复用。

Fetch 本身不支持直接设置超时时间,但可以通过 AbortController 主动终止请求,结合 setTimeout 实现超时控制。
使用 AbortController 触发中断
AbortController 提供了一个 signal 对象,传给 fetch 的 options 中,调用 controller.abort() 即可中止正在进行的请求。
- 创建 controller:const controller = new AbortController()
- 将 signal 传入 fetch:fetch(url, { signal: controller.signal })
- 超时后调用 controller.abort(),此时 fetch 会立即 reject 并抛出 AbortError
封装带超时的 fetch 函数
把超时逻辑封装成可复用的方法,避免每次手动写 setTimeout 和 abort。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 接收 url、options、timeout(毫秒)三个参数
- 内部创建 AbortController,并在 timeout 后调用 abort()
- 捕获 AbortError 并统一处理,比如返回特定错误信息或抛出新错误
- 注意:需在 fetch reject 后清理定时器,防止内存泄漏
处理超时后的错误类型
fetch 被 abort 后会 reject 一个 DOMException,name 属性为 "AbortError"。需针对性判断,避免和网络错误混淆。
- 用
error.name === 'AbortError'区分超时和其他错误 - 不要只依赖
!response.ok或catch一并处理,否则无法区分是超时还是服务端异常 - 可配合自定义错误类,让业务层更容易识别超时场景
注意事项与常见坑
AbortController 在部分旧环境(如 IE)不支持,需考虑 polyfill;另外 signal 只能使用一次,重复 abort 无效。
- 不能复用同一个 signal 发起多个 fetch,每个请求应配独立 controller
- 若请求已结束(resolve 或 reject),再调用 abort 不会报错但无效果
- 某些浏览器对 AbortSignal 的兼容性较弱,可在构建时引入 abort-controller polyfill
- 取消请求不会自动关闭连接,但后续响应数据会被浏览器丢弃
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










