当前位置: 首页 > news >正文

Vue3中AbortController取消请求的用法详解

在 Vue3 中,AbortController 用于取消 fetch 请求,避免组件卸载后仍执行异步操作导致的潜在问题(如内存泄漏或更新已销毁组件的状态)。以下是详细用法和最佳实践:


一、基本用法

  1. 创建 AbortController 实例
    在组件 setup() 中创建实例,并通过 signal 关联请求:

    javascript

    import { onUnmounted } from 'vue';export default {setup() {const controller = new AbortController();const signal = controller.signal;// 发送请求时传递 signalfetch('/api/data', { signal }).then(response => response.json()).catch(err => {if (err.name === 'AbortError') {console.log('请求已取消');} else {console.error('请求失败:', err);}});// 组件卸载时取消请求onUnmounted(() => controller.abort());return {};},
    };

二、结合异步操作

在异步函数中结合 AbortController

javascript

import { onUnmounted } from 'vue';export default {setup() {const controller = new AbortController();const fetchData = async () => {try {const response = await fetch('/api/data', { signal: controller.signal });const data = await response.json();// 处理数据} catch (err) {if (err.name === 'AbortError') {console.log('请求已取消');} else {console.error('请求失败:', err);}}};fetchData();onUnmounted(() => controller.abort());},
};

三、管理多个请求

单个 AbortController 可取消多个请求:

javascript

const controller = new AbortController();// 请求1
fetch('/api/data1', { signal: controller.signal });// 请求2
fetch('/api/data2', { signal: controller.signal });// 取消所有请求
controller.abort();

四、与 Axios 结合使用

如果使用 Axios,可通过 CancelToken(旧版)或 AbortController(Axios >= 0.22.0)取消请求:

javascript

import axios from 'axios';const controller = new AbortController();axios.get('/api/data', {signal: controller.signal,
}).then(response => { /* ... */ }).catch(err => {if (axios.isCancel(err)) {console.log('请求已取消');}});// 取消请求
controller.abort();

五、注意事项

  1. 兼容性
    AbortController 在现代浏览器中支持良好,但需考虑旧版浏览器兼容性(可通过 polyfill 解决)。

  2. 错误处理
    捕获 AbortError 避免未处理的 Promise 拒绝。

  3. 复用 Controller
    每次新请求前创建新的 AbortController,避免重复使用已取消的实例。


六、最佳实践

  • 在组件卸载时取消请求:在 onUnmounted 生命周期钩子中调用 abort()

  • 封装可复用的逻辑:将取消逻辑封装到自定义 Hook 中(如 useFetch)。

  • 避免内存泄漏:确保所有未完成的请求在组件销毁时被取消。


通过合理使用 AbortController,可以有效管理 Vue3 中的异步操作,提升应用性能和稳定性。

相关文章:

  • 模态链:利用视觉-语言模型从多模态人类视频中学习操作程序
  • 计算机网络 | Chapter1 计算机网络和因特网
  • 数据库系统概论(五)关系模型的数据结构及形式化
  • 高中数学联赛模拟试题精选第19套几何题
  • Java数据结构——Stack
  • 机器学习(10)——神经网络
  • 代码随想录算法训练营第五十九天 | 1.ford算法精讲 卡码网94.城市间货物运输
  • 用python借用飞书机器人群发布定期内容
  • Eclipse 插件开发 3 菜单栏
  • 2025.04.26-饿了么春招笔试题-第一题
  • c++ package_task
  • 【Hive入门】Hive分桶表深度解析:从哈希分桶到Join优化的完整指南
  • Ubuntu编译opencv源码
  • SpringBoot实现的后端开发
  • 【计算机视觉】CV实战项目 -深度解析PaddleSegSharp:基于PaddleSeg的.NET图像分割解决方案
  • 数值数据处理的黄金法则:构建高质量机器学习模型的基石‌
  • per-task affinity 是什么?
  • 思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)
  • 配置文件的四级分类
  • 在Mybatis中为什么要同时指定扫描mapper接口和 mapper.xml 文件,理论单独扫描 xml 文件就可以啊
  • 中国纪检监察报刊文:要让劳动最光荣成为社会的崇高风尚
  • 央行回应美债波动:单一市场、单一资产变动对我国外储影响总体有限
  • 上海市市管干部任职前公示:赵亮拟为地区区长人选
  • 应勇:以法治力量服务黄河流域生态保护和高质量发展
  • 2025年上海空间信息大会举行,重大项目集中签约
  • 巴黎奥运后红土首秀落败,郑钦文止步马德里站次轮