vue3 + axios 停止取消接口请求

打印 上一主题 下一主题

主题 809|帖子 809|积分 2427

媒介

近来开发过程中,总是碰到想把正在请求的axios接口取消,这种情况有很多应用场景,举几个例子:

  • 弹窗中接口请求返回图片,用于前端展示,接口还没返回数据,此时关闭弹窗,需要停止接口请求
  • tab标签页根据后端返回数据,依次渲染,频仍切换标签,需要停止接口请求
  • for循环中请求接口,碰到跳出循环情况,也需要停止接口请求
  • 跳转路由,离开页面时,可能也需要停止接口请求
下面就是根据以上问题,找到的解决方案
正文

由于axios差别版本取消请求是差别的,目前最新的 axios 的取消请求api,保举使用 AbortController ,旧版本的 CancelToken 在 v0.22.0 后弃用,截止到此片文章发表,npm上的axios版本号已经更新到v1.5.1,但是信任有一些项目标版本还是v0.x.x的,所以下面分别介绍两种取消方式,各人根据自己项目axios版本号,自行查察

v0.22.0 CancelToken


  • get请求
  1. <el-button type="primary" @click="sendGet()">发送get请求</el-button>
  2. <el-button type="danger" @click="cancel()">取消请求</el-button>
  3. import {ref,onMounted,onUnmounted} from 'vue'
  4. import axios from "axios";
  5. let source:any = null;
  6. const sendGet = ()=>{
  7.         //可以理解为给定每个接口一个标识
  8.   source = axios.CancelToken.source();
  9.   axios.get('请求url',
  10.       {
  11.         cancelToken: source.token
  12.       }
  13.   ).then(res => {
  14.     console.log("get请求",res)
  15.   }).catch(err => {
  16.     if (axios.isCancel(err)) {
  17.       console.log('请求取消', err);
  18.     } else {
  19.       console.log('其他错误', err)
  20.     }
  21.   });
  22. }
  23. const cancel = ()=>{
  24.   source && source.cancel('手动调用 source.cancel方法,手动取消请求');
  25. }
复制代码


  • post请求
  1. <el-button type="success" @click="sendPost()">发送post请求</el-button>
  2. <el-button type="danger" @click="cancel()">取消请求</el-button>
  3. import {ref,onMounted,onUnmounted} from 'vue'
  4. import axios from "axios";
  5. let source:any = null;
  6. const sendPost = ()=>{
  7.   source = axios.CancelToken.source();
  8.   axios.post("请求url",
  9.        {},//传参,没有也必须加上{}
  10.        {
  11.          cancelToken: source.token
  12.        })
  13.        .then((res) => {
  14.          console.log("post请求",res)
  15.        }).catch(err => {
  16.      if (axios.isCancel(err)) {
  17.        console.log('请求取消', err);
  18.      } else {
  19.        console.log('其他错误', err)
  20.      }
  21.    })
  22. }
  23. const cancel = ()=>{
  24.   source && source.cancel('手动调用 source.cancel方法,手动取消请求');
  25. }
复制代码

v1.5.1 AbortController

使用fetch() 是一个全局方法,它的请求是基于 Promise 的
method - 请求方法,默认GET
signal - 用于取消 fetch
  1. <el-button type="primary" @click="sendNewGet()">发送get请求</el-button>
  2. <el-button type="danger" @click="cancelController()">取消新版请求</el-button>
  3. import {ref,onMounted,onUnmounted} from 'vue'
  4. import axios from "axios";
  5. let controller:any = null;
  6. const sendNewGet = ()=>{
  7. controller = new AbortController();   // 新建一个AbortController实例
  8.   fetch('请求url',
  9.       {
  10.         signal: controller.signal    // signal是AbortController实例的属性
  11.       }
  12.   ).then(res => {
  13.     console.log("新版get请求",res)
  14.     //处理返回数据
  15.     res.json().then(res1 => {
  16.       console.log(res1)
  17.     })
  18.   }).catch(err => {
  19.     console.log(err)
  20.   });
  21. }
  22. const cancelController = ()=>{
  23.   controller && controller.abort();//调用abort方法
  24. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表