vue取消接口请求CancelToken

本文探讨了在JavaScript中使用axios库时如何优雅地处理多次接口请求间的取消,提供了两种解决方案:一是通过统一封装管理CancelToken,二是针对单个接口实现取消功能。实例展示了如何在Vue中应用这些技巧来确保请求的高效管理和错误处理。

   因业务需求,需要请求多次同一接口,需要在请求接口时,取消上个未完成的接口请求

解决方案一:统一封装

1. 可以利用CancelToken工厂函数创建cancel token

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

const CancelToken = axios.CancelToken;

const source = CancelToken.source();

// get 方法使用案例

axios.get('user/12345', {

  cancelToken: source.token

}).catch(function(thrown) {

  if (axios.isCancel(thrown)) {

    console.log('Request canceled', thrown.message)

  else {

    // TODO: handle error

  }

})

// post 使用案例

axios.post('/user/12345', {

  name: 'name what'

}, {

  cancelToken: source.token

})

// 执行取消请求操作

source.cancel(‘请求已取消’)

解决方案二:单个接口处理

1、api处

import axios from 'axios';


//导出表格
export function DataExport(data, _this) {
    return request({
        url: 'data/export',
        responseType: 'blob',
        method: 'post',
        data: data,
        cancelToken: new axios.CancelToken((c) => {
            _this.cancelFun = c
        }),
    })
}

2、vue调用处理

export default {
  data() {
    return {
      cancelFun: null, //取消接口
    };
  },
  methods: {
    //运行接口
    CatchExport(){
      this.cancelCsv();
        DataCatchExport(this.queryParams, this).then((res) => {
           this.$message({
                type: "success",
                message: "导出成功!",
              });
            })
            .catch((err) => {
              console.log(err);
            });
    },
     //取消接口
    cancelCsv() {
      if (typeof this.cancelFun === "function") {
        this.cancelFun();
      }
    },
  }
}

<think>我们正在寻找在Vue3中取消接口请求的方法。根据引用内容,Vue3本身不直接处理HTTP请求,通常搭配Axios或fetch使用。以下是几种方法: 1. 使用Axios的CancelToken(引用[1][2][4]): - 创建一个CancelToken source,将其token放入请求配置中 - 调用source.cancel()来取消请求 2. 使用AbortController(引用[1][5]): - 这是现代浏览器原生支持的API,适用于fetch或Axios(新版本支持) - 创建一个AbortController实例,将其signal放入请求配置 - 调用controller.abort()取消请求 3. 封装取消逻辑(引用[2][3][4]): - 可以全局管理取消令牌,例如使用Map存储,根据请求标识(如method+url)来取消重复请求 具体实现示例: **方法1:Axios CancelToken(适用于旧版Axios)** ```javascript import axios from 'axios'; // 创建一个source const source = axios.CancelToken.source(); axios.get('/url', { cancelToken: source.token }).catch(err => { if (axios.isCancel(err)) { console.log('请求取消', err.message); } }); // 取消请求 source.cancel('取消原因'); ``` **方法2:AbortController(推荐,兼容新版Axios和fetch)** ```javascript const controller = new AbortController(); axios.get('/url', { signal: controller.signal }).catch(err => { if (axios.isCancel(err)) { console.log('请求取消', err.message); } }); // 取消请求 controller.abort(); ``` **在Vue组件中使用(封装示例,引用[4])** ```javascript // 在组件中 methods: { fetchData() { this.controller = new AbortController(); // 存储controller axios.get('/url', { signal: this.controller.signal }) .then(...) .catch(...); } }, beforeUnmount() { // 组件卸载时取消请求 this.controller.abort(); } ``` **全局管理取消令牌(引用[2][3])** - 可以在axios拦截器中实现重复请求取消,使用Map存储每个请求取消令牌,当同一请求再次发出时,取消前一个。 注意:引用[5]指出,Axios同时支持两种取消方式,但不要混用(即同一个请求不要同时使用cancelToken和signal)。 总结:在Vue3中取消接口请求,推荐使用AbortController(现代标准),或Axios的CancelToken(旧项目兼容)。在组件销毁时取消请求可避免内存泄漏。 相关问题: 1. 如何在Vue3中使用AbortController取消多个请求? 2. Axios的CancelToken和AbortController有什么区别? 3. 如何全局配置Axios拦截器实现自动取消重复请求? </think>在 Vue 3 中取消接口请求的实现方法主要依赖于 HTTP 客户端库(如 Axios 或 fetch API),以下是三种主流实现方案: ### 方案一:使用 Axios + CancelToken(经典方案) ```javascript // 创建取消令牌源 const source = axios.CancelToken.source(); // 发送请求时附加cancelToken axios.get('/api/data', { cancelToken: source.token }).catch(err => { if (axios.isCancel(err)) { console.log('请求取消', err.message); } }); // 取消请求(在组件卸载或需要时调用) source.cancel('用户主动取消请求'); ``` **适用场景**: - 兼容旧版 Axios 的项目 - 需要精确控制单个请求取消[^1][^2] ### 方案二:使用 AbortController(现代标准) ```javascript // 创建中止控制器 const controller = new AbortController(); // 发送请求时附加signal fetch('/api/data', { signal: controller.signal }).catch(err => { if (err.name === 'AbortError') { console.log('请求已中止'); } }); // 中止请求(在组件卸载或需要时调用) controller.abort(); ``` **优势**: - 浏览器原生支持,无需额外库 - 同时适用于 fetch 和 Axios(v0.22.0+)[^1][^5] - 符合 Web 标准 ### 方案三:全局请求管理(企业级方案) ```javascript // utils/request.js const pendingMap = new Map(); axios.interceptors.request.use(config => { const key = `${config.method}-${config.url}`; if (pendingMap.has(key)) { pendingMap.get(key)(); // 取消重复请求 } config.cancelToken = new axios.CancelToken(cancel => { pendingMap.set(key, cancel); }); return config; }); // 组件中使用 import request from '@/utils/request'; export const fetchData = () => request.get('/api/data'); // 组件卸载时清除 onUnmounted(() => { pendingMap.forEach(cancel => cancel()); pendingMap.clear(); }); ``` **核心功能**: 1. 自动取消重复请求(相同 URL+method)[^2][^3] 2. 统一管理所有进行中的请求 3. 防止内存泄漏(组件卸载时自动清理)[^4] ### 组件集成示例(Vue 3 Composition API) ```vue <script setup> import { onUnmounted, ref } from 'vue'; import axios from 'axios'; const controller = ref(null); const fetchData = async () => { controller.value = new AbortController(); try { const res = await axios.get('/api/data', { signal: controller.value.signal }); // 处理数据... } catch (err) { if (!axios.isCancel(err)) { // 处理真实错误 } } }; // 组件卸载时自动取消 onUnmounted(() => { controller.value?.abort(); }); </script> ``` ### 方案选择建议 | **方案** | **适用场景** | **优势** | |-------------------|---------------------------------|--------------------------| | CancelToken | 旧版 Axios 项目 | 兼容性好 | | AbortController | 现代浏览器/新版 Axios | 标准化、支持 fetch | | 全局请求管理 | 中大型项目/需要精细控制 | 避免重复请求、统一管理 | > **最佳实践**: > 1. 路由切换时在**导航守卫**中取消当前页面所有请求 > 2. 表单提交等场景使用**防抖+请求取消**避免重复提交 > 3. 长轮询任务需在组件卸载时显式中止[^4][^5] 相关问题: 1. 如何实现 Vue 3 中路由切换时自动取消所有进行中的请求? 2. Axios 的 CancelToken 和 AbortController 在实现机制上有何本质区别? 3. 在全局请求管理中,如何处理需要允许重复请求的特殊接口
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值