同事写的,我也是借花献佛,顺带做个笔记

axios拦截器添加取消请求的方法

因为我们需要在路由进入前判断有没有存在取消请求的方法,所以需要一个存储介质,选用数组,然后存放在vuex中,一是方便动态追踪,二是本来就在axios和router里面import了vuex,就没必要添加window的全局变量了。

javascript
复制代码
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代码

javascript
复制代码
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; }, } }

路由进入前取消等待中的请求

javascript
复制代码
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取消请求的文章。

分类: vue 项目实战 标签: vueroutervuex路由axios取消请求

评论

全部评论 2

  1. hebing
    hebing
    Google Chrome Windows 10
    请问这个api.interceptors,这个api是啥。为啥国内的文章全是缺斤短缺的,哎
    1. 木灵鱼儿
      木灵鱼儿
      FireFox Windows 10
      @hebing那说明你对axios一点都不熟悉,这是axios的拦截器

目录