AbortController 是标准且推荐的 fetch 取消方式,通过 signal 传入 fetch 并调用 abort() 中断请求;需在 React useEffect 清理函数中调用 abort() 防止内存泄漏;现代浏览器支持良好,IE 需 polyfill。

Fetch 本身不支持直接取消请求,但可以通过 AbortController 实现取消功能。这是目前标准、兼容性好且推荐的方式。
使用 AbortController 主动取消请求
AbortController 提供了一个 signal 对象,可以传给 fetch 作为选项,再通过调用 controller.abort() 中断请求。
- 创建 AbortController 实例,获取其 signal
- 将 signal 作为 { signal } 传入 fetch 调用
- 在需要时调用 controller.abort(),fetch 会立即 reject 并抛出 AbortError
示例:
const controller = new AbortController();const signal = controller.signal;
fetch('/api/data', { signal })
.then(res => res.json())
.then(data => console.log(data))
.catch(err => {
if (err.name === 'AbortError') {
console.log('请求已被取消');
} else {
console.error('请求失败:', err);
}
});
// 3 秒后取消(模拟用户手动取消或超时)
setTimeout(() => controller.abort(), 3000);
配合 React 等框架自动清理
在组件卸载或依赖变化时,应确保 abort 被调用,避免内存泄漏或状态更新错误。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- React 中可在 useEffect 的清理函数里调用 controller.abort()
- 不要在 abort 后再 setState,需检查组件是否已卸载(或使用 useRef 标记)
- 每个请求建议使用独立的 AbortController,避免误取消其他请求
注意兼容性和常见陷阱
AbortController 在现代浏览器中支持良好(Chrome 65+、Firefox 57+、Safari 12.1+),但 IE 完全不支持,需 polyfill 或降级方案。
- signal 只能被 abort 一次,重复调用 abort() 不会报错但无效
- fetch 抛出的 AbortError 是 DOMException 类型,name 属性为 'AbortError'
- 不能用 Promise.race 包裹 fetch + timeout 来“模拟取消”,那只是忽略结果,请求仍在后台进行
超时场景的实用封装
常把 abort 和 timeout 结合,实现真正的请求超时控制。
- 设置固定 timeout 时间,到时自动 abort
- 封装成可复用的 fetchWithTimeout 函数
- 注意:timeout 应略大于服务端超时,避免客户端过早中断
不复杂但容易忽略细节。

















