使用Axios取消重复请求

221 阅读2分钟

  背景:在web中或多或少会存在重复发送同一个请求的方式,这时就需要取消重复请求。使用Axios的实现方式思路如下:
  1、创建一个Map,用来存储请求信息;
  2、创建添加请求和删除请求的方法;
  3、使用Axios的请求拦截器对每个请求进行拦截,判断是否存在,若存在就取消请求,否则就添加到Map中。
  4、使用Axios的相应拦截器,删除Map中存在的请求

1、创建Map, 存储请求信息

    const pendingRequest = new Map();

2、创建添加和删除请求的方法

  Map中Key的组合方式可以是请求类型+URL地址或者是请求类型+URL+参数,Key是用来后续判断请求是否存在的条件,这里使用请求类型+URL地址的形式形成Key。

    const generateReqKey = (config: AxiosRequestConfig) => {
      const { method, url } = config;
      return [method, url].join('&');
    };

  添加请求的方法,这里使用Axios的CancelToken来取消重复请求,给每个Map值都添加上取消请求的方法cancel用来取消重复请求。

    const addPendingRequest = (config: AxiosRequestConfig) => {
      const requestKey = generateReqKey(config);
      config.cancelToken =
        config.cancelToken ||
        new axios.CancelToken(cancel => {
          if (!pendingRequest.has(requestKey)) {
            pendingRequest.set(requestKey, cancel);
          }
        });
    };

  取消请求的方法

    const removePendingRequest = (config: AxiosRequestConfig) => {
      const requestKey = generateReqKey(config);
      if (pendingRequest.has(requestKey)) {
        const cancelToken = pendingRequest.get(requestKey);
        // 取消请求
        cancelToken(requestKey);
        // 从Map中删除对应的请求
        pendingRequest.delete(requestKey);
      }
    };

3、使用Axios的请求拦截器对请求进行处理

    axios.interceptors.request.use(
      function (config) {
        removePendingRequest(config);
        addPendingRequest(config);
        return config;
      },
      function (error) {
        return Promise.reject(error);
      }
    );

4、使用Axios的相应拦截器对请求成功或失败的请求从Map中删除

    axios.interceptors.response.use(
      function (response) {
        removePendingRequest(response.config);
        const { code } = response.data;
        // 根据返回的状态码进行页面跳转或数据返回
      },
      function (error) {
        removePendingRequest(error.config || {});
        return Promise.reject(error);
      }
    );

结语:以上就是使用Axios取消重复请求的方式,希望对大家有所帮助。