axios当切换路由页面,取消正在请求的数据接口
296 words
One minute
应用场景:当切换路由页面,取消正在请求的接口
1.请求拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// axios.js
window._axiosPromiseArr = [] // axios中设置放置要取消的对象
// 请求拦截器
axios.interceptors.request.use(config => {
config.cancelToken = new axios.CancelToken(cancel => {
// 存储取消请求接口对象
window._axiosPromiseArr.push({ cancel });
});
return config;
}, error => {
console.log(error);
return Promise.reject(error);
});
|
2.响应拦截器
1
2
3
4
5
6
7
8
9
|
service.interceptors.response.use(response => {
// 在请求完成后,从数组中移除相应的取消函数
window._axiosPromiseArr = window._axiosPromiseArr.filter(ele => ele.cancel !== response.config.cancelToken.promise);
return response;
}, error => {
// 在请求错误时,也移除相应的取消函数
window._axiosPromiseArr = window._axiosPromiseArr.filter(ele => ele.cancel !== error.config?.cancelToken?.promise);
return Promise.reject(error);
});
|
3.进入路由钩子拦截时候,取消保存的_axiosPromiseArr
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// main.js
router.beforeEach((to, from, next) => {
// 遍历并取消所有未完成的请求
window._axiosPromiseArr.forEach(ele => {
if (ele.cancel) {
ele.cancel(); // 取消请求
}
});
// 清空请求数组
window._axiosPromiseArr = []; // 清空请求的参数
next(); // 继续路由导航
});
|