Vue 3组合式函数中通过AbortController与onScopeDispose绑定组件作用域,实现请求自动取消、覆盖及卸载清理;封装useRequestCancel提供controller、abort、signal,兼容fetch与axios(v1.7+原生支持signal)。

在 Vue 3 组合式函数中封装请求取消逻辑,核心是把 AbortController 的生命周期与组件作用域绑定,做到“旧请求自动终止、新请求干净发起、卸载时自动清理”。不依赖全局状态,也不硬编码请求库,保持可复用性和类型安全性。
用 AbortController + onScopeDispose 实现自动清理
每次请求都新建一个 AbortController,并在 setup 作用域销毁时调用 abort(),避免内存泄漏和响应错误更新:
- 在组合式函数内部创建
const controller = new AbortController() - 将
controller.signal传给fetch或 axios(需适配:axios v1.7+ 支持signal,旧版仍可用cancelToken) - 调用
onScopeDispose(() => controller.abort()),确保组件卸载或函数被丢弃时自动中止
支持请求中断与覆盖的 watch 响应机制
当请求参数(如搜索关键词、分页页码)变化时,应主动中止上一次未完成的请求,再发新的:
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
- 用 ref 缓存上一个
AbortController实例 - 在
watch回调中先调用prevController?.abort(),再新建 controller 并赋值 - 确保 signal 只用于当前有效请求,避免“幽灵响应”更新到已过期的状态
封装成通用 useRequestCancel 工具函数
可抽离为独立的组合式函数,返回控制器管理和中止能力,供其他请求类 Composable 复用:
立即学习“前端免费学习笔记(深入)”;
- 导出
useRequestCancel(),返回{ controller, abort, signal } - 内部用
ref(null)存 controller,并在onScopeDispose中统一 abort - 暴露
abort()方法供外部手动触发(例如用户点击“取消加载”按钮) - 调用方只需解构 signal 传入请求,无需关心生命周期管理细节
适配 axios 的兼容写法(含版本差异)
若项目仍在使用 axios 旧版本(AbortSignal 到 CancelToken:
- 导入
axios.CancelToken,用CancelToken.source()创建 source - 监听
signal.aborted,触发source.cancel() - 推荐渐进升级至 axios 1.7+,直接支持
signal选项,更标准、更轻量

















