当前位置: 首页 > 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.gsyq.cn/news/42040.html

相关文章:

  • .NET 开发:通过 C# 提取 PDF 中的图片
  • 机器人焊接混合气降本案例
  • SmartProxy HTTPS 代理 – 企业级出站 Web 访问与数据采集的安全可运营基座
  • 2025年房屋转向承建实力厂家权威推荐榜单:房屋转向技术/房屋整体转向/房屋平移转向源头厂家精选
  • Oracle VirtualBox windows 和物理机系统共享文件夹
  • 完整教程:免费华为云服务器教程华为云沃土云创计划
  • BIO、NIO、AIO的区别
  • 从楼宇到能源,BA190 打开万物互联的“数据桥梁”
  • 详细介绍:Qt C++ :QWidget类的主要属性和接口函数
  • 2025年封闭母线槽生产厂家权威推荐榜单:浇注母线槽/母线槽/密集母线槽源头厂家精选
  • 2025 年地坪源头厂家最新推荐榜:五大优质企业深度测评,含材料施工一体化服务及权威协会认证
  • 2025年电动截止阀定制厂家排行,电动截止阀定制厂家推荐
  • Windows2019IIS+PHP+MySQL环境搭建教程
  • 2025年哈尔滨孤独症和自闭症的区别在哪里机构权威推荐榜单:怎么判断孩子自闭症/自闭症康复训练/治疗自闭症最好方法源头厂家精选
  • 2025年甘肃处理恋爱纠纷权威推荐:甘肃处理劳动纠纷/甘肃处理侵权纠纷/甘肃处理遗产继承服务机构精选
  • 适合高级用户的15款Linux发行版
  • 2025年度医用钢制瓦楞板推荐供应商:正规厂商品牌实力全解析
  • docker部署安装milvus(向量数据库)、配置依赖etcd和MinIO - 详解
  • 从零搭建私有云盘:基于RustFS的全栈实践指南
  • 《白色相簿2》终章-滑雪线小春线玩后感
  • Unity TMP(TextMesh Pro)字体导入及相关设置整理(官方文档整理)
  • AWS S3服务,将当前桶设置成公开访问教程
  • 2025年天津实验室装修机构权威推荐:天津厂房设计/天津写字楼装修/天津办公室装修服务商精选
  • 工控开发必看:Linux 下主流编程语言优劣对比
  • 2025年江苏化工设备企业年度排名:斯路森性价比怎么样
  • 2025年YT保温材料订制厂家权威推荐榜单:YT无机活性保温砂浆/YT保温砂浆/防潮保温砂浆源头厂家精选
  • The 2025 ICPC Asia Wuhan Regional Contest
  • python 字符串压缩(字符串-中等)含源码(九) - 教程
  • 学术会议合集 | 声学、流体力学、当代体育、信息技术等EI会议合集
  • 2025年广州电商交易平台权威推荐榜单:b2b系统/电商平台/企业数字化平台精选