AbortController

最后更新:2026-10-28

AbortController AbortController

AbortController 是浏览器原生 API:把它的 signal 传给 fetch,调用 abort() 即可中途取消请求。组件卸载、参数变化、搜索防抖场景里,取消过期请求既省流量,更避免「旧响应覆盖新数据」的竞态 bug。

分组数据与工程化
类型API
引入版本浏览器原生 API(DOM Living Standard)

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

const ctrl = new AbortController()

fetch('/api/search?q=' + kw, { signal: ctrl.signal })
  .then(r => r.json())
  .catch(err => {
    if (err.name === 'AbortError') return   // 主动取消,不算错误
    showError(err)
  })

ctrl.abort()   // 触发:fetch 以 AbortError 拒绝

⚙️ 参数

signalAbortSignal 实例,传给 fetch 的 options.signal;同一个 signal 可绑定多个请求,一次全取消。

返回值:构造函数返回 { signal, abort() }:signal 交给 fetch 监听,abort() 触发取消,请求以 AbortError 拒绝。

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

点「发请求」进入 loading;在返回前点「取消请求」,状态变 aborted 而不是 error——被取消的请求不会更新任何 UI。

💡 要点

⚠️ 注意 取消不是错误:catch 里必须单独识别 err.name === 'AbortError',否则用户主动取消会被当成故障弹提示。
💡 提示 useEffect 的 cleanup 里 abort 上一次请求,是解决「快速切换 tab 数据错乱」竞态的标准解法。
ℹ️ 说明 同一个 signal 还可传给事件监听(addEventListener 的 signal 选项),abort 一次全部取消。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q 请求已被取消还能恢复吗?
A 不能,连接已断开。需要暂停/恢复语义时要自己实现队列,或重新发起请求。
Q AbortError 和超时是一回事吗?
A 不是。超时可手动 setTimeout(() => ctrl.abort(), 5000) 实现,也可用 AbortSignal.timeout(5000) 一行代替(较新浏览器)。
Q 为什么组件卸载要取消请求?
A 卸载后组件不再需要数据,放任请求既浪费带宽,响应到达后还可能把过期数据写进新一次渲染。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏