当前位置: 首页 > news >正文

axios 取消重复请求

一、获取请求key

import { MD5 } from "crypto-js";
getRequestKey(config: InternalAxiosRequestConfig) {const { method, baseURL, data, url, params } = config;return MD5([method, `${baseURL}${url}`, JSON.stringify(params), JSON.stringify(data)].join("&")).toString();},

二、保存新的请求数据

let requestList = new Map()axiosInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {const key = useRequeryStoreInfo.getRequestKey(config);const controller = new AbortController();config.signal = controller.signal;requestList.set(key, controller);return config;},(error) => {return Promise.reject(error);}
);

三、判断是否是重复请求

let requestList = new Map()axiosInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {const key = getRequestKey(config);if (requestList .size != 0 && requestList.has(key)) {console.log("重复请求");}return config;},(error) => {return Promise.reject(error);}
);

四、取消重复请求

   const controller = this.requestList.get(key);if (controller) {controller.abort();requestList.delete(key);}

五、请求完成后移出请求列表

axiosInstance.interceptors.response.use((response: AxiosResponse) => {// 请求完成移除const key = getRequestKey(response.config);requestList.delete(key);return response.data;},(error) => {if (error.config) {// 请求完成移除const key = getRequestKey(error.config);requestList.delete(key);}return Promise.reject(error);}
);

六、完整代码:

  • store\request.ts中:
import { defineStore } from "pinia";
import type { InternalAxiosRequestConfig } from "axios";
import { MD5 } from "crypto-js";/*** 网络请求* requestList:请求数据*/
interface State {token: string;requestList: Map<string, AbortController>;
}
export const useRequeryStore = defineStore("requery", {persist: {pick: ["token"] // 只持久化token},state: (): State => ({token: "",requestList: new Map()}),getters: {// 获取requestListgetRequestList: (state) => state.requestList,// 获取TokengetToken: (state) => state.token},actions: {// 设置TokensetToken(token: string) {this.token = token;},// 获取请求keygetRequestKey(config: InternalAxiosRequestConfig) {const { method, baseURL, data, url, params } = config;return MD5([method, `${baseURL}${url}`, JSON.stringify(params), JSON.stringify(data)].join("&")).toString();},// 存储请求数据setRequest(key: string, controller: AbortController) {this.requestList.set(key, controller);},// 移出重复请求removeRequest(key: string) {const controller = this.requestList.get(key);if (controller) {controller.abort();this.requestList.delete(key);}}}
});
  • utils\request.ts中:
import axios from "axios";
import type { InternalAxiosRequestConfig, AxiosResponse, AxiosInstance } from "axios";
import { useRequeryStore } from "@/store/request";
const useRequeryStoreInfo = useRequeryStore();// 创建Axios实例
const axiosInstance: AxiosInstance = axios.create({baseURL: import.meta.env.VITE_BASE_URL,timeout: 60000 // 延时时间:60s
});// 请求拦截器
axiosInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {const key = useRequeryStoreInfo.getRequestKey(config);// 取消之前的请求if (useRequeryStoreInfo.getRequestList.size != 0 && useRequeryStoreInfo.getRequestList.has(key)) {ElMessage.warning("请勿重复操作!");useRequeryStoreInfo.removeRequest(key);}// 开始新的请求const controller = new AbortController();config.signal = controller.signal;useRequeryStoreInfo.setRequest(key, controller);return config;},(error) => {return Promise.reject(error);}
);// 响应拦截器
axiosInstance.interceptors.response.use((response: AxiosResponse) => {// 请求完成移除const key = useRequeryStoreInfo.getRequestKey(response.config);useRequeryStoreInfo.getRequestList.delete(key);return response.data;},(error) => {if (error.config) {// 请求完成移除const key = useRequeryStoreInfo.getRequestKey(error.config);useRequeryStoreInfo.getRequestList.delete(key);}return Promise.reject(error);}
);export default axiosInstance;
http://www.jsqmd.com/news/33397/

相关文章:

  • .NET 开发:通过 C# 提取 PDF 中的图片
  • 不怕水、不怕震、不怕脏:IPM100让信号采集在任何环境都稳定在线
  • 机器人焊接混合气降本案例
  • 2025 年螺杆泵生产厂家最新推荐排行榜:国内优质品牌权威测评,助力企业精准选品萨伯特螺杆泵/污泥螺杆泵公司推荐
  • 2025 年最新推荐化工泵厂家口碑榜单:依托央企合作经验优选高稳定性能产品指南不锈钢化工泵/氟塑料化工泵公司推荐
  • SmartProxy HTTPS 代理 – 企业级出站 Web 访问与数据采集的安全可运营基座
  • 2025年房屋转向承建实力厂家权威推荐榜单:房屋转向技术/房屋整体转向/房屋平移转向源头厂家精选
  • 2025年广州搬家公司权威推荐榜单:大众搬家/蚂蚁搬家/厂房搬迁源头公司精选
  • Oracle VirtualBox windows 和物理机系统共享文件夹
  • 视频汇聚平台EasyCVR如何赋能高清网络摄像机打造高性价比视频监控系统?
  • 完整教程:免费华为云服务器教程华为云沃土云创计划
  • BIO、NIO、AIO的区别
  • 【LVGL】部件 - 基础对象
  • 2025年深圳外贸找客户公司权威推荐榜单:海外社媒运营/外贸找客户的软件/外贸找客户软件源头公司精选
  • 【比赛记录】2025CSP+NOIP 冲刺模拟赛合集Ⅳ
  • 从楼宇到能源,BA190 打开万物互联的“数据桥梁”
  • 记一次现场数据库CPU居高不下,排查和解决过程
  • 激活函数之Softmax
  • 详细介绍:Qt C++ :QWidget类的主要属性和接口函数
  • 黑龙江公务员考试靠谱培训公司推荐排行榜,公务员考试培训机构
  • 基础排序算法(九)桶排序
  • 新晋社区之星何晨阳:从使用者到贡献者,我是如何理解并反哺开源?
  • 2025年304材质不锈钢网筐厂家权威推荐:DIN托盘不锈钢网筐/304不锈钢消毒清洗篮/轧花网压型筐源头厂家精选
  • 2025年封闭母线槽生产厂家权威推荐榜单:浇注母线槽/母线槽/密集母线槽源头厂家精选
  • 2025 年地坪源头厂家最新推荐榜:五大优质企业深度测评,含材料施工一体化服务及权威协会认证
  • 华为云认证 - 云学堂「集证」有礼 - 实践
  • mysql命令行登录
  • 2025年高压电子束焊机厂商排名:高压电子束焊机生产厂全解析
  • 2025年哈尔滨比较好的公考培训企业排名,公考专业培训机构推荐
  • 2025年电动截止阀定制厂家排行,电动截止阀定制厂家推荐