abortcontroller 是浏览器原生最可靠通用的请求取消方案,需配合支持 signal 的 api(如 fetch)使用;fetch 中必须在调用前创建 controller 并传入 signal,调用 abort() 后 promise 以 aborterror 拒绝,复用实例或漏传 signal 将导致取消失效。

浏览器原生的 AbortController 是目前最可靠、最通用的请求取消方案,但必须配合支持 signal 参数的 API(如 fetch)才能生效;直接用于 XMLHttpRequest 或第三方库(如 axios)需额外适配,否则调用 abort() 无效。
fetch 中正确使用 AbortController
核心是把 controller.signal 传给 fetch() 的 signal 选项,且必须在请求发出前绑定。一旦调用 controller.abort(),正在 fetch 的 Promise 会立即以 AbortError 拒绝。
常见错误:在 fetch().then() 里才创建 controller,或漏传 signal —— 这两种情况 abort() 完全不起作用。
实操建议:
- 始终在
fetch()调用前初始化const controller = new AbortController() - 确保
fetch(url, { signal: controller.signal })显式传入signal - 捕获错误时检查
error.name === 'AbortError',避免和网络错误混淆 - 示例:
const controller = new AbortController(); fetch('/api/data', { signal: controller.signal }) .catch(err => { if (err.name === 'AbortError') console.log('请求已取消'); }); // 后续某处调用: controller.abort();
axios 怎么用 AbortController 取消请求
axios 1.3.0+ 原生支持 AbortController,但老版本(如 0.21.x)只认 CancelToken。若项目不能升级,AbortController 无法直接生效。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
实操建议:
- 确认 axios 版本 ≥ 1.3.0:
console.log(axios.version) - 新版写法:直接传
signal,和 fetch 一致:axios.get('/api', { signal: controller.signal }) - 旧版必须改用
CancelToken.source(),且controller.abort()不起作用 - 注意:axios 的
signal支持是“只读代理”,调用controller.abort()才真正触发取消,不是自动监听
XMLHttpRequest 能不能用 AbortController
不能。原生 XMLHttpRequest 不接受 signal 参数,AbortController 对它完全无效。强行传入会被忽略,abort() 调用后请求仍在后台运行。
实操建议:
- 改用
fetch是最干净的解法 - 若必须用
XHR,只能手动调用xhr.abort(),并自行清理回调、超时定时器等副作用 - 不要试图把
controller.signal塞进xhr配置对象——语法合法但无任何效果 - 第三方封装库(如 jQuery.ajax)同理,除非明确文档说明支持
signal,否则默认不兼容
容易被忽略的边界问题
取消不是“销毁请求”,而是中断响应处理流程。已发送的请求可能仍在服务端执行,甚至返回成功响应(只是前端不再接收)。这点在重试逻辑或资源释放场景中极易出错。
实操建议:
- 取消后务必清空相关状态变量(如
loading = false),否则 UI 可能卡在加载态 - 多个并发请求共用一个
controller时,一次abort()会取消全部 —— 如需独立控制,每个请求配单独controller -
AbortController实例不可复用:abort()后再次调用会抛InvalidStateError - React 等框架中,组件卸载时取消请求是常规操作,但要注意
useEffect清理函数执行时机,避免 setState on unmounted component
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










