axios请求中断的几种方法

 更新时间:2024年10月15日 08:25:29   作者:小胖霞  
在实际应用场景中,假如有一个下载或者导出请求,数据量非常大的情况下,接口响应的会很慢,这时候我我们想中断请求,该怎么做呢?本文给大家介绍了axios请求中断的几种方法,需要的朋友可以参考下

背景

在实际应用场景中,假如有一个下载或者导出请求,数据量非常大的情况下,接口响应的会很慢,这时候我我们想中断请求,该怎么做呢?

我们先来看一下axios官方给出的请求中断的方法 AXios请求中断 axios中文网

方法一:传入cancelToken

传入cancelToken,在页面调用request.cancel('中断请求')

api请求代码: axios代码封装request.js

import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

const service = axios.create({
  baseURL: process.env.VUE_APP_API, 
  timeout: 1800000 
})
    // 请求拦截
  service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['Authorization'] = getToken()
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截
service.interceptors.response.use(
 
  response => {
    const res = response.data
  
    if (!res.status && response.status === 200) {
      return response
    }
    if (res.status !== '200') {
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000,
        dangerouslyUseHTMLString: true
      })
      if (res.status === '401') {
      
        MessageBox.confirm('访问了未授权的资源或者登入状态已失效,你可以继续留在这个页面,或者重新登入', '是否重新登入', {
          confirmButtonText: '重新登入',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          // 清空Token,并且重新登入
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    if (error.response && error.response.status === 401) {
        MessageBox.confirm('提示', '是否重新登入', {
          confirmButtonText: '重新登入',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          // 清空Token,并且重新登入
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
      }
      return true
    } else if (error.response && error.response.status === 502) {
      Message({
        message: '502 系统正在重新发布中,请稍后再试',
        type: 'error',
        duration: 5 * 1000
      })
    } else if (error.response && error.response.status === 404) {
      Message({
        message: '404 系统正在重新发布中或请求不存在,请稍后再试',
        type: 'error',
        duration: 5 * 1000
      })
    } else {
      Message({
        message: error.message,
        type: 'error',
        duration: 5 * 1000,
        dangerouslyUseHTMLString: true
      })
    }
    return Promise.reject(error)
  }
)

// api.js
import request from '@/utils/request'
// 这是一个导出接口
export function export(data, cancelToken) {
  return request({
    url: '/order/order-export',
    method: 'post',
    responseType: 'blob',
    data,
    cancelToken
  })

在页面中调用接口

<button @click='exportData'>导出</button>
<button @click='handleCancel'>取消</button>
import {export} from '@/api.js'
import axios from 'axios'
data() {
    return {
        request:null
    }
}

methods:{
// 导出
exportData() {
     const request = axios.CancelToken.source()
     this.request = request
     export({},request.token)
     .then(res => {})
     .catch((err) => {})
 },
 //取消
 handleCancel () {
  this.request.cancel('中断请求')
 }
}

方法二:AbortController

此方法必须要求axios的版本最低是V0.22.0,否则不生效 还是上面的代码,做以下修改:

// api.js
export function exportData(data) {
  return request({
    url: '/order/order-export',
    method: 'post',
    responseType: 'blob',
    data,
    signal: data.signal  // 新加的代码
  })
}
// 页面中使用
import {export} from '@/api.js'
import axios from 'axios'
let controller;

methods:{
// 导出
exportData() {
     controller = new AbortController()
      export({singal:controller.singal}).then(res => {
      
      console.log('下载成功')
      
      })
      .catch((err) => {
      if (axios.isCancel(err)) {
      console.log('下载被取消') 
      } else if (err.name === 'AbortError') {
      console.log('下载被中止') 
      } else {
          console.error(`下载错误:${err.message}`) 
         } 
      })
 },
 //取消
 handleCancel () {
  if (controller) { 
     controller.abort() // 使用 abort 方法中止下载 console.log('中止导出')
   }
 }
}

多个请求的取消

此方法利用 fetch API 方式—— AbortController 取消请求:

首先要对request.js的封装做出修改

// 取消请求
export const abortRequest = (controller) => {
  if (controller) {
    controller.abort()
  }
}

// 请求拦截
service.interceptors.request.use(
  (config) => {
    if (config.abortController) {
      config.signal = config.abortController.signal
    }
    ...其他代码跟上面一样
    return config
    })
// api.js
export function download(data, abortController) {
  return request({
    url: '/order/order-download',
    method: 'POST',
    responseType: 'blob',
    data,
    abortController // 新加的代码
  })
}

export function exportData(data,abortController) {
  return request({
    url: '/order/order-export',
    method: 'post',
    responseType: 'blob',
    data,
    abortController  // 新加的代码
  })
}

在页面中使用

<div>
    <button @click="fetchData1">发起请求 1</button>
    <button @click="abortDownload1">中止请求 1</button>
    <button @click="fetchData2">发起请求 2</button>
    <button @click="abortDownload2">中止请求 2</button>
  </div>
let controller1;
let controller2;
import {abortRequest} from '@/utils/request.js'
import {exportData,downLoad} from '@/api'
methods:{
   // 取消请求1
    abortDownload1() {
         abortRequest(controller1)
    }
    // 取消请求2
     abortDownload2() {
         abortRequest(controller2)
    }
    
    // 发起请求1
    fetchData1() {
        controller1 = new AbortController()
         const abortController = controller1
        exportData(data,abortController).then(res => {
            console.log('成功')
        })
        .catch(err => {
               if (axios.isCancel(err)) {
            console.log('下载被取消')
            common.showMessage(this, '到导出取消', 'warning')
          } else if (err.name === 'AbortError') {
            console.log('下载被中止')
          } else {
            console.error(`下载错误:${err.message}`)
          }
        })
    
    },
      fetchData2() {
        controller2 = new AbortController()
         const abortController = controller2
        download(data,abortController).then(res => {
            console.log('成功')
        })
        .catch(err => {
               if (axios.isCancel(err)) {
            console.log('下载被取消')
            common.showMessage(this, '到导出取消', 'warning')
          } else if (err.name === 'AbortError') {
            console.log('下载被中止')
          } else {
            console.error(`下载错误:${err.message}`)
          }
        })
    
    },
    
    
}

到此这篇关于axios请求中断的几种方法的文章就介绍到这了,更多相关axios请求中断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决vue+element 键盘回车事件导致页面刷新的问题

    解决vue+element 键盘回车事件导致页面刷新的问题

    今天小编就为大家分享一篇解决vue+element 键盘回车事件导致页面刷新的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Vue中mixins的使用方法以及实际项目应用指南

    Vue中mixins的使用方法以及实际项目应用指南

    vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用,下面这篇文章主要给大家介绍了关于Vue中mixins的使用方法以及实际项目应用指南,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 如何利用Vue3管理系统实现动态路由和动态侧边菜单栏

    如何利用Vue3管理系统实现动态路由和动态侧边菜单栏

    通常我们在vue项目中都是前端配置好路由的,但在一些项目中我们可能会遇到权限控制,这样我们就涉及到动态路由的设置了,下面这篇文章主要给大家介绍了关于如何利用Vue3管理系统实现动态路由和动态侧边菜单栏的相关资料,需要的朋友可以参考下
    2022-02-02
  • 实例教学如何写vue插件

    实例教学如何写vue插件

    本次小编通过一个简单的实例来教给大家如何写一个vue插件,以及需要注意的地方,如果有需要的读者跟着学习一下吧。
    2017-11-11
  • 深入学习Vue nextTick的用法及原理

    深入学习Vue nextTick的用法及原理

    这篇文章主要介绍了深入学习Vue nextTick的用法及原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Vue加载组件、动态加载组件的几种方式

    Vue加载组件、动态加载组件的几种方式

    组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。这篇文章通过实例代码给大家介绍了Vue加载组件、动态加载组件的几种方式,需要的朋友参考下吧
    2018-08-08
  • Vue+Elementui el-tree树只能选择子节点并且支持检索功能

    Vue+Elementui el-tree树只能选择子节点并且支持检索功能

    这篇文章给大家介绍了Vue+Element UI el-tree树只能选择子节点并且支持检索的文章,通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Element UI安装全过程

    Element UI安装全过程

    element ui 就是基于vue的一个ui框架,该框架基于vue开发了很多相关组件,方便我们快速开发页面,饿了么前端团队基于vue进行开发并且进行了开源 element ui 中提供全部都是封装好组件,本文给大家介绍Element UI安装全过程,感兴趣的朋友一起看看吧
    2024-01-01
  • Vue源码cached解析

    Vue源码cached解析

    最近在写闭包的应用的时候,出现了一个cached函数,来源于Vue源码,利用了闭包变量不会被回收的特点,可以缓存变量,cached本质上是一个高阶函数,它接受一个函数的参数,同时返回一个函数
    2022-08-08
  • vue-loader和webpack项目配置及npm错误问题的解决

    vue-loader和webpack项目配置及npm错误问题的解决

    这篇文章主要介绍了vue-loader和webpack项目配置及npm错误问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论