fetch本身不支持直接设置超时,但可通过AbortController配合setTimeout实现标准超时中断:创建controller并传入signal,超时调用abort(),封装时需finally清除定时器并catch判断AbortError。

fetch 本身不支持直接设置超时时间,但可以通过 AbortController 配合 setTimeout 实现请求超时中断。
使用 AbortController 主动中止请求
这是目前标准、推荐的方式。通过创建 AbortController 实例,把它的 signal 传给 fetch,在超时后调用 controller.abort() 即可中断请求。
- 创建
const controller = new AbortController() - 将
{ signal: controller.signal }作为 fetch 的配置项传入 - 用
setTimeout(() => controller.abort(), 5000)设置 5 秒超时 - 捕获
AbortError(通常为DOMException: The user aborted a request.)做错误处理
封装一个带超时的 fetch 函数
避免每次手动写重复逻辑,可以封装成通用函数:
function fetchWithTimeout(url, options = {}, timeout = 5000) {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
return fetch(url, {
...options,
signal: controller.signal
}).finally(() => clearTimeout(id));
}
注意:.finally() 清除定时器防止内存泄漏;实际使用中建议在 catch 中判断 error.name === 'AbortError' 来区分超时和其他错误。
立即学习“Java免费学习笔记(深入)”;
注意事项和常见问题
不是所有环境都完全支持 AbortController(如旧版 Safari 或 IE),生产环境需检查兼容性或引入 polyfill。
- 超时后 fetch Promise 会立即 reject,不会等待响应返回
- 已发出的请求在服务端可能仍在执行,Abort 只影响客户端接收和处理
- 如果同时发起多个请求,每个都需要独立的 AbortController
- 某些浏览器对 abort 后的错误信息描述略有不同,建议统一用
error.name === 'AbortError'判断
替代方案(不推荐但可了解)
用 Promise.race 拼接一个延时 reject 的 Promise,虽然能实现超时效果,但无法真正中止底层网络请求,只是提前拒绝 Promise,资源仍可能被占用。
所以优先使用 AbortController 方式,语义清晰、真正中断、符合规范。


















