vue路由切换取消上一个路由未完成的axios请求
同事写的,我也是借花献佛,顺带做个笔记
axios拦截器添加取消请求的方法
因为我们需要在路由进入前判断有没有存在取消请求的方法,所以需要一个存储介质,选用数组,然后存放在vuex中,一是方便动态追踪,二是本来就在axios和router里面import了vuex,就没必要添加window的全局变量了。
import axios from "axios";
import store from "./store"; //vuex
//拦截器
api.interceptors.request.use(config => {
//设置取消请求的CancelToken
config.cancelToken = new axios.CancelToken(cancel => {
//存入vuex数组
store.commit("pushAxiosPromiseArr", cancel);
});
return config;
});
vuex代码
export default {
state: {
axiosPromiseArr: [], //请求的axios
},
getters: {
axiosPromiseArr(state) {
return state.axiosPromiseArr;
}
},
mutations:{
pushAxiosPromiseArr(state, value) {
state.axiosPromiseArr.push(value);
},
setAxiosPromiseArr(state, value) {
state.axiosPromiseArr = value;
},
}
}
路由进入前取消等待中的请求
import Vue from 'vue';
import VueRouter from 'vue-router';
import store from "./store"; //vuex
Vue.use(VueRouter);
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes: [...]
});
//路由守卫 进入前
router.beforeEach((to, from, next) => {
//路由跳转之前,中止还在等待的请求
store.getters.axiosPromiseArr.forEach((cancel) => cancel());
store.commit("setAxiosPromiseArr", []);
next();
})
具体代码自己按照自己的项目调整,这里说一下取消axios请求后会进入error方法,所以建议每个api请求后面都接一个catch捕获错误,你可以不处理这个错误,但是一定要catch捕获,不然全局会抛出取消请求的错误对象。
具体请看本博客的axios取消请求的文章。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
全部评论 2
hebing
Google Chrome Windows 10木灵鱼儿
FireFox Windows 10