前言
-
开发当中看到了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 确定是一个接口时,在取消接口调用同时,要把它上一个在数组中的接口清楚掉,不然会数组会越来越长
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
})
// 取消方法
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调用取消上一次接口调用 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!
什么不足的地方请大家指出谢谢 -- 風过无痕