axios取消重复请求

axios取消重复请求

应用场景:

一次操作触发多个请求,请求响应顺序错乱将会影响展示的结果

实现思路:

通过 Axios 的请求拦截器和响应拦截器来实现取消重复请求的功能。每当一个新的请求被发起时,都会检查是否存在相同的请求,如果存在,则取消之前的请求。使用axios.CancelToken 来创建取消令牌,并将其附加到请求配置中。当请求完成或被取消时,会从 pendingRequests 中移除对应的请求和取消函数。实际情况中并不是所有接口都需要进行取消操作,所以在请求配置中添加了一个 allowCancel标记,在请求拦截器中,如果检测到该标记存在,则进行取消操作 ,对于其他未标记允许取消请求的接口,直接发送请求,不进行取消操作。

代码

axios 封装

复制代码
import axios from 'axios';

const http = axios.create({
  timeout: 20000,
  withCredentials: true,
  headers: { 'X-Requested-With': 'XMLHttpRequest' },
})

// 用于存储每个请求的取消函数
const pendingRequests = new Map();

// 添加请求拦截器
http.interceptors.request.use(config => {
  // 如果请求配置中没有标记允许取消请求,则直接发送请求,不进行取消操作
  if (!config.allowCancel) {
    return config;
  }

  // 在发送请求之前,检查是否存在相同的请求
  const requestId = JSON.stringify(config);
  if (pendingRequests.has(requestId)) {
    // 如果存在相同的请求,则取消之前的请求
    pendingRequests.get(requestId).cancel();
  }
  
  // 创建新的取消令牌
  const cancelTokenSource = axios.CancelToken.source();
  config.cancelToken = cancelTokenSource.token;

  // 存储新的请求和取消函数
  pendingRequests.set(requestId, cancelTokenSource);
  
  return config;
}, error => {
  return Promise.reject(error);
});

// 添加响应拦截器
http.interceptors.response.use(response => {
  // 请求完成后,从 pendingRequests 中移除对应的请求和取消函数
  const requestId = JSON.stringify(response.config);
  pendingRequests.delete(requestId);
  return response;
}, error => {
  // 如果请求被取消,则直接返回空响应
  if (axios.isCancel(error)) {
  	// 自定义返回内容
    return Promise.resolve({
      data: null,
      status: -1,
      statusText: 'Request canceled'
    });
  }
  
  return Promise.reject(error);
});

使用示例

复制代码
// 示例函数,发起 GET 请求
const fetchData = async  () => {
  try {
    // 允许取消请求的接口
    const response1 = await api.get('/getData1', { allowCancel: true });
    console.log(response1.data);
    
    // 不允许取消请求的接口
    const response2 = await api.get('/getData2');
    console.log(response2.data);
  } catch (error) {
    console.error('Error:', error);
  }
}

// 调用示例函数
fetchData();
相关推荐
aichitang20249 分钟前
前端小skill
前端·人工智能·算法·ai·前端框架
前端·柱子1 小时前
q-floodfill白边锯齿?一招搞定抗锯齿边缘问题
前端·html·canva可画
葡萄城技术团队1 小时前
SpreadJS V19.2新特性揭秘:功能区键盘提示
前端
计算机魔术师1 小时前
AI 幻觉导致的错误情报险些引发美军拦截中国船只
前端
万物智能1 小时前
SARADC模数转换—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
前端·后端
志尊宝2 小时前
Vue3 零基础每日笔记(037):动手封装 useMouse 与 useWindowSize——事件监听的标准模板
前端·javascript·vue.js·笔记·html5
aixingpan2 小时前
aixingpan.cn API开发文档:api_docs_bichart_natalvssolar_return2接口指南
前端·php
八荒启·交互动画3 小时前
Web特效019-Web特效的定义与边界核心算法手写一遍:先跑起来,再谈高级效果
前端·webgl·网页特效·八荒启-交互动画·八荒启
晨枫阳3 小时前
Keycloak 授权体系详解:资源、策略、权限
前端
志尊宝4 小时前
Vue3 零基础每日笔记(047):动态路由与路由参数——:id 传参、query 传参、props 解耦
前端·javascript·vue.js·笔记·html5