vue组合式函数中取消未完成请求的核心是用abortcontroller配合fetch或axios:每次请求新建controller,watch响应式参数变化时abort旧请求,onscopedispose清理,并捕获aborterror。

在 Vue 组合式函数(Composable)中取消未完成的请求,核心是利用 AbortController 配合请求库(如 fetch 或 axios)实现请求中断,并确保组件卸载或逻辑变更时自动清理。
使用 AbortController 配合 fetch
fetch 原生支持 signal 选项,可传入 AbortController.signal。组合式函数中应在每次请求前创建控制器,在副作用清理函数中调用 abort():
- 在
onBeforeUnmount或onScopeDispose(Vue 3.4+)中调用controller.abort() - 若请求由响应式状态(如搜索关键词)触发,需在新请求发起前中止旧请求
- 避免在已 abort 的 signal 上重复调用
abort()(安全,但无必要)
封装可取消的 useRequest 组合式函数
可抽象一个基础的 useRequest,内部管理 AbortController 生命周期:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 每次调用
execute()时新建 controller,并保存引用 - 上一次请求未完成时,先调用其
abort() - 使用
onScopeDispose(推荐)或onBeforeUnmount清理当前 controller - 返回的 promise 应捕获
AbortError(如err.name === 'AbortError'),避免报错干扰业务逻辑
与 axios 配合的注意事项
axios v0.22+ 支持 signal,用法与 fetch 一致;旧版本需用 cancelToken(已废弃,不推荐):
- 确保 axios 版本 ≥ 0.22,直接传
{ signal: controller.signal } - axios 会自动将 abort 转为
Cancel错误,可通过isCancel工具函数判断 - 不要混用
signal和cancelToken,否则行为不可预测
响应式依赖变化时自动取消旧请求
当请求参数(如 searchTerm)是响应式引用时,watch 它的变化并主动中止上一轮请求:
- 用
watch监听参数,触发前检查是否存在待取消的 controller - 执行新请求前,调用旧 controller 的
abort(),再创建新 controller - 避免在异步请求回调中直接操作已销毁组件的状态(配合
isRef或getCurrentInstance判断仍挂载)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










