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

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取消请求的文章。

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

评论

全部评论 2

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

目录