Axios利用拦截器取消页面切换pending中的请求

我们在开发时 经常会遇到类似场景

  • 切换页面时,某些情况导致 当前页面pending中的请求未完成,切换到新页面,之前的请求逻辑还会异常处理

今天,我们解决类似问题:

处理流程:

当前页面 请求拦截 新页面 当前请求cancel函数与url 存储到内存(vuex)数组中 利用router.beforeEach 取消pending请求,清空数组 当前页面 请求拦截 新页面

代码:

vuex定义模块cancel.js

  • cancelTokenArr {arr} 用来存储当前请求数据
  • addCancelToken {function} 添加请求
  • clearCancelToken {function} 取消请求并且清空数组
export default {
    state: {
        cancelTokenArr:[] // 存储cancel token
    },
    mutations: {
        addCancelToken({cancelTokenArr},data){
            cancelTokenArr.push(data)
        },
        clearCancelToken(state){
            state.cancelTokenArr.map(item => {
                item.cancel(`${item.url}---路由切换取消请求`)
            })
            state.cancelTokenArr = []
        }
    }
}

request.js

请求发出前,利用拦截器将取消的cancel函数与当次url利用addCancelToken存储到内存(vuex)中

import axios from 'axios'
import store from '../store'

// 请求拦截器
axios.interceptors.request.use(config => {
   // 请求发出时,添加到cancelTokenArr中
   config.cancelToken = new axios.CancelToken(e => {
       store.commit('addCancelToken', {
           cancel: e,
           url: location.host + config.url
       })
    })
  })
  return config
}, error => {
  Message.error('未知错误')
  return Promise.reject(error)
})

请求发出后,利用响应拦截器处理取消请求

axios.interceptors.response.use(response => {...},error => {
  // 这里判断异常情况,如果axios.isCancel 为 true时,说明请求被取消
  if (axios.isCancel(error)) {
    // 请求取消
    console.warn(error)
    console.table([error.message.split('---')[0]], 'cancel')
  } else {...}
}

利用router.beforeEach切换路由时取消当前pending中的请求

main.js 或者 router.js

// 切换路由时取消正在pending的请求
router.beforeEach((to, from, next) => {
   store.commit('clearCancelToken')
   next()   
}

总结:

  • vuex存储数据
    存储当前的请求函数与url,支持新增清除
  • 请求拦截器
    利用vuex数组存储每次发出请求取消函数以及url
  • 路由切换前
    取消pending中的请求并且清除当前存储的请求数组

效果:
在这里插入图片描述至此,我们就成功拦截页面切换时pending中的请求

链接:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
axios响应拦截器是无法直接获取请求参数的,因为请求参数是在请求拦截器处理的,而响应拦截器是在服务器响应之后处理的,两者之间没有直接的联系。不过,我们可以通过一些方法来间接获取请求参数,下面介绍两种常用的方法。 1. 使用闭包 在请求拦截器获取请求参数,并将参数存储在闭包,然后在响应拦截器使用即可。 ```javascript import axios from 'axios' let requestData // 定义一个变量用于存储请求参数 const instance = axios.create({ // ... }) instance.interceptors.request.use(config => { // 在请求发送之前获取请求参数,并存储在requestData requestData = config.data || config.params return config }) instance.interceptors.response.use(response => { // 在响应处理之前使用requestData console.log(requestData) return response }) ``` 2. 使用自定义属性 在请求拦截器,将请求参数存储在请求配置对象的自定义属性,然后在响应拦截器获取自定义属性即可。 ```javascript import axios from 'axios' const instance = axios.create({ // ... }) instance.interceptors.request.use(config => { // 在请求发送之前将请求参数存储在自定义属性 config.requestData = config.data || config.params return config }) instance.interceptors.response.use(response => { // 在响应处理之前获取自定义属性请求参数 console.log(response.config.requestData) return response }) ``` 以上两种方法都可以间接获取请求参数,具体使用哪种方法取决于实际需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小小白zyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值