axios-CancelToken方法取消请求-控制多次同样api调用取消上一次接口调用

前言

  • 开发当中看到了axios取消方法,经过查阅,axios这个包是提供了取消请求的方法的。

  • 移动端当是tab栏类的页面,或者是下拉刷新和上拉加载是一个接口是,会出现20条情况(接口调用2次)。

  • pc端同一个按钮,分页在连续触发之后会调用多次同样接口,这样会数据不对,资源占用。

  • 其实是网络或者人为导致api触发多次,这时候我们就要根据axios取消方法稍作更改。

思路

1.axios实例是提供了CancelToken () 取消请求,

2.我们只要把第一次api调用时的取消方法传递给fn,当第二次api调用的时候把第一次api取消掉,

3.原理其实是跟防抖节流差不多.

代码实现

1.局部使用--一个接口api配置取消方法-api文件配置

let fn = () => {}
export const artsysyuer = params => {
  // 调用上一次产生的取消方法
  fn()
  return request({
    url: '/sysuer/arti/message',
    params
    cancelToken: new axios.CancelToken(canceIFn => {
       // canceLFn: 取消当前这个接口请求方法
       fn = canceIFn
     })
  })
}

2.全局使用的时候我们应该在请求拦截中配置-request.js

注意:

2.1 全局使用时要准备一个空数组,不止一个接口,根据接口路径(url)和请求方式(method)来判断是否是一个接口

2.2 确定是一个接口时,在取消接口调用同时,要把它上一个在数组中的接口清楚掉,不然会数组会越来越长

2.3注意现在是所有的接口都会触发axios取消-但是可能1个接口需要传参不同,功能不同就会导致功能确实,比如查评论和查评论回复,这样就会有一个接口触发不了,所以我们要控制axios是否执行取消功能,我们要遭在封装api的时候给他一个标识控制axios取消的执行

// 获取评论
export const jskskhd = params => {
  return request({
    url: '/uisd/jskskhd',
    params,
    // 这个标志控制这个接口不执行axios二次请求取消
    nouisd: true
  })
}
import axios from 'axios'
// 引入vuex
import store from '@/store'
// js文件导入Toast
import { Toast } from 'vant'
// 设置基地址
const request = axios.create({
  // process.env 是node下的一个全局变量
  // .env是根据package.json中运行的什么环境,去找地址
  baseURL: process.env.VUE_APP_BASE_API
})
​
// 设置一个存储接口数据的变量 用于axios取消
let canseLArr = []
​
// 请求拦截
request.interceptors.request.use(
  config => {
    // 这里面打印的信息 有一个data 可以打印出接口里面设置信息
    // console.log('config', config) config有接口传过来的信息
    config.headers.Authorization = 'Bearer ' + store.getters.token
​
    // axios 取消
    canseLArr = canseLArr.filter(item => {
      // 自带怎么判断是同一个接口在重复请求  遍历这个数组如果请求方式和url一样就是同一个接口
      if (item.url === config.url && item.method === config.method) {
        // 确定是同一个接口调用取消方法
        item.fn()
        // 销毁数据 不然这个数组会越来越大
        // 符合这个要求的接口 调用取消asiox方法后 不保留
        return false
      }
      // 不符合这个要求的接口 保留接口
      return true
    })
    if (!config.nouisd) {
       // 取消方法
        config.cancelToken = new axios.CancelToken(cancelFn => {
       // config 把地址和方式存进数组中 方便后面判断   所有方法存进数组中
        canseLArr.push({
         url: config.url,
         method: config.method,
         fn: cancelFn
        })
      })
     }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

效果图


总结:

经过这一趟流程下来相信你也对 axios-CancelToken方法取消请求-控制多次同样api调用取消上一次接口调用 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!

什么不足的地方请大家指出谢谢 -- 風过无痕

猜你喜欢

转载自blog.csdn.net/weixin_53579656/article/details/131031363