取消请求
用途
- 单页切换过程中,取消上个页面的请求,避免页面已经切换了,但是请求还在发送。
- token 过期,取消后续的请求,避免没有意义的请求。
实现
实现思路:1.在所有请求之前将请求进行存储,我选择的存储驱动是vuex.。2.路由的前置事件中添加一个取消请求的过滤器。
存储所有的请求
// cancelStore.js
const state = {
axiosPromiseArr: [],
}
const getters = {
axiosPromiseArr: state => {
return state.axiosPromiseArr
}
}
const mutations = {
ADD_AXIOS: (state, data) => {
state.axiosPromiseArr.push(data)
},
DELETE_AXIOS: (state, index) => {
delete state.axiosPromiseArr[index]
},
INIT_AXIOS: (state) => {
state.axiosPromiseArr = []
},
}
const actions = {
storeAxios({ commit }, params) {
commit('ADD_AXIOS', params)
},
deleteAxios({ commit }, params) {
commit('DELETE_AXIOS', params)
},
initAxios({ commit }, params) {
commit('INIT_AXIOS', params)
},
}
export default {
state,
getters,
mutations,
actions
}
// cancelRequestInterceptors.js
import axios from 'axios'
const CancelToken = axios.CancelToken;
export default function cancelRequest(store,config) {
//cancel 白名单 /user/refreshToken 方便刷新接口 我这里使用了 lodash 函数库(_)
let cancelWhiteList = ['/user/refreshToken']
if (_.indexOf(cancelWhiteList, config.url) === -1) {
config.cancelToken = new CancelToken((cancel) => {
store.dispatch('storeAxios', cancel)
})
}
return config
}
在路由中添加取消的前置事件
import store from '@/store'
export default function cancelRequest() {
store.getters.axiosPromiseArr.forEach((e,i) => {
typeof(e)==='function'&&e()
store.dispatch('storeAxios', i)
store.dispatch('hideLoading')
});
// 每次请求完成后清空 否则这个变量会越来越大 使页面变卡
store.dispatch('initAxios')
}
使用位置
1.路由的前置中间件,取消上次页面的请求.
2.接口请求的后置中间件,取消响应码为token 过期,之后的所有请求.避免没必要的请求.
注意
- 如何排除一些需要取消的请求。
- 每一个页面切换完成后一定要清空存储axios的对象,否则页面会很卡顿。

本文暂时没有评论,来添加一个吧(●'◡'●)