在某些特殊的场景业务下,需要手动停止未完成的Ajax请求,或在快速切换页面时,停止上一页面未完成的请求,减少资源浪费

实现目标:

  • 封装全局的变量及方法
  • 通过全局方法的引入,在页面直接调用该方法取消当前为完成的请求
  • 无需引入,在使用vue的页面可直接使用

实现方式

    • 新建JS文件,单独封装方法
  • 在main.js中引入该JS文件,进行全局注入 (或者直接在main.js中注入方法)
  • 在单个请求中单独添加cancelToken标识
  • 全部请求(axios封装位置)发起时添加cancelToken标识
  • 调用全局方法停止当前正在进行的Ajax请求

1、在main.js中注入方法

/**
 *取消正在进行中请求
 * cancelList设置批量取消的接口,/**代表符合该规则的全部接口
 * * 全局方法$cancelRequest可取消当前cancelList中的正在请求requset
 * * 全局方法$cancelRequest("url")可控制取消单个请求
 * */
const cancelDefaltList = ['/user/name','/org/number/**']
Vue.prototype.$currentHttpRequestList = new Map();
Vue.prototype.$cancelRequest = function(cancelkey) {
  if (cancelkey) {
    if (cancelkey.indexOf('/**') > -1) {
      Vue.prototype.$currentHttpRequestList.forEach((item, key) => {
        key.indexOf(cancelkey.split('/**')[0]) > -1 && item('Operation canceled by the user.');
      });
    } else {
      Vue.prototype.$currentHttpRequestList.get(cancelkey) && Vue.prototype.$currentHttpRequestList.get(cancelkey)('Operation canceled by the user.');
    }
  } else {
    cancelDefaltList.forEach(eachWite => {
      Vue.prototype.$currentHttpRequestList.forEach((item, key) => {
      key.indexOf(eachWite.split('/**')[0]) > -1 && item('Operation canceled by the user.')
      })
    })
 }
};

2、 在在请求拦截器中添加(也可以按照需求在某些请求中单独添加)cancelToken标识

axios.interceptors.request.use(
  function(config) {
    const CancelToken = axios.CancelToken;
    var token = getToken();
    config.headers['Content-Type'] = 'application/json; charset=UTF-8';
    config.headers.Authorization = 'bearer ' + token; // 设置请求头
    //添加cancelToken标识
    config.cancelToken = new CancelToken(function executor(c) {
      Vue.prototype.$currentHttpRequestList.set(config.url, c);
    });
    return config;
  },
  function(err) {
    if (err && err.message === 'Operation canceld by the user.') {
      console.log(err, 'errorcancel');
      return;
    }
    return Promise.reject(err);
  }
);

3、按照需求(业务逻辑)调用全局方法停止当前正在进行的Ajax请求

<template>
</template>

<script>
export default {
  name: 'test',
  data() {
    return {};
  },
  created(){
      //实际使用位置需根据具体的业务场景需求而定,此处放在created中只是个示例
      this.$cancelRequest('/user/name/**');//取消以‘/user/name/’开头的正在进行中的请求
      this.$cancelRequest('/user/age');//取消正在进行中的请求‘/user/age/’
      this.$cancelRequest();  //取消cancelDefaltList设置的全部正在进行中的请求
  },
  methods: {}
Logo

前往低代码交流专区

更多推荐