重复请求问题

使用Promise和AbortController来实现思路是:通过在会话缓存中存储和比较请求信息,来防止用户在短时间内重复提交相同的请求。

具体思路如下:

  1. 存储请求信息:每次请求时,将请求的相关信息(如URL、数据和时间)存储在会话缓存中,以便后续比较。
  2. 检查缓存:在处理新的请求时,首先从会话缓存中获取上一次请求的信息。
  3. 判断条件:通过比较当前请求和上一次请求的信息,判断是否为重复提交。具体判断条件包括:
    • 请求的URL是否相同。
    • 请求的数据是否相同。
    • 当前请求时间与上次请求时间的差是否小于设定的间隔时间(例如1秒)。
  4. 处理重复提交:如果满足重复提交的条件,则阻止当前请求的处理,并返回一个错误信息,提示用户“数据正在处理,请勿重复提交”。
  5. 更新缓存:如果不满足重复提交的条件,则将当前请求的信息更新到会话缓存中,以便下次请求时进行比较。
// 假设我们有一个请求函数
function sendRequest(requestObj) {// 创建一个新的AbortController实例const controller = new AbortController();const signal = controller.signal;// 检查会话缓存中的请求信息const sessionObj = cache.session.getJSON('sessionObj');const interval = 1000; // 间隔时间(ms)if (sessionObj) {const s_url = sessionObj.url;const s_data = sessionObj.data;const s_time = sessionObj.time;// 检测重复请求if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {const message = '数据正在处理,请勿重复提交';console.warn(`[${s_url}]: ` + message);// 取消当前请求controller.abort();return Promise.reject(new Error(message));}}// 更新会话缓存cache.session.setJSON('sessionObj', requestObj);// 发起请求return fetch(requestObj.url, { method: 'POST', body: JSON.stringify(requestObj.data), signal }).then(response => {if (!response.ok) {throw new Error('请求失败');}return response.json();}).catch(error => {if (error.name === 'AbortError') {console.log('请求已取消');} else {console.error('请求错误:', error);}throw error;});
}// 使用如下。
const requestObj = {url: 'https://example.com/api',data: { key: 'value' },time: Date.now()
};sendRequest(requestObj).then(data => {console.log('请求成功:', data);}).catch(error => {console.error('请求失败:', error.message);});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91491.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91491.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91491.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7 Docker安装RocketMQ完整教程

目录 前言 环境准备 系统要求 检查Docker状态 创建网络和目录 创建Docker网络 创建数据目录 安装NameServer 启动NameServer容器 参数说明 验证NameServer启动 安装Broker 创建Broker配置文件 启动Broker容器 参数说明 验证Broker启动 安装管理控制台 启动控制…

main函数,常量指针与指针常量,野指针等,void与void的区别

指针&#xff08;续&#xff09; main函数原型 定义 main函数有多种定义格式&#xff0c;main函数也是函数&#xff0c;函数相关的结论对main函数也有效。 main函数的完整写法&#xff1a;int main(int argc, char *argv[]){..}int main(int argc, char **argv){..}扩展写法&am…

Mac m系列芯片安装node14版本使用nvm + Rosetta 2

由于苹果 M 系列芯片&#xff08;包括 M4&#xff09;使用的是 ARM 架构&#xff0c;而 Node.js 14 是在英特尔 x86 架构时代发布的&#xff0c;因此在 M 系列 Mac 上安装 Node.js 14 可能会遇到兼容性问题 解决方法&#xff1a;使用 nvm Rosetta 2右键点击「终端」→「显示简…

前端基础之《Vue(26)—Vue3两种语法范式》

一、选项式1、HTML写法<!-- 跟 Vue 说 Hello World&#xff01; --><script type"module"> import { createApp } from vuecreateApp({data() {return {message: Hello World!}} }).mount(#app) </script><div id"app"><h1>…

题目:BUUCTF之rip(pwn)

网址 BUUCTF在线评测https://buuoj.cn/challenges#rip打开&#xff0c;如图所示 提示&#xff1a;先别启动靶机&#xff0c;靶机可以最后在启动&#xff0c;先分析下载的附件pwn1。 点击下载&#xff0c;下载完成之后&#xff0c;该文件后缀类型改为exe&#xff08;就是将pwn…

el-button长按触发事件(含未响应的解决方案)

参考代码实现按钮长按触发逻辑 <template><el-button mousedown"handleMouseDown" mouseup"handleMouseUp">长按我</el-button> </template>data(){return{isPressed: false,timer: null,}},methods:{handleMouseDown() {this.isP…

List和 ObservableCollection 的区别

1. 变更通知机制​​ ​​ObservableCollection<T>​​ 实现了INotifyCollectionChanged和INotifyPropertyChanged接口&#xff0c;当集合元素被添加、删除、替换或重置时&#xff0c;会自动触发CollectionChanged事件&#xff0c;通知绑定的UI控件更新&#xff08;如WPF…

支付宝沙箱(白屏,用户订单参数错误等)

情况&#xff1a;Laravel项目的line 对接 支付宝沙箱测试 手机网站支付 1&#xff1a;沙箱地址&#xff0c;小到我找不到&#xff1a;沙箱应用 - 开放平台 2&#xff1a;虽然提供了系统密钥&#xff0c;但是只是测API链接的&#xff0c;要沙箱测试转账什么的&#xff0c;得用…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论IP地图可视化分析实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解微博评论IP地图可视化分析实现 视频在线地…

【代码随想录】刷题笔记——二叉树篇

目录 144. 二叉树的前序遍历 94. 二叉树的中序遍历 145. 二叉树的后序遍历 102. 二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树 104. 二叉树的最大深度 111. 二叉树的最小深度 222. 完全二叉树的节点个数 110. 平衡二叉树 257. 二叉树的所有路径 404. 左叶子之…

基于deepseek的文本解析 - 超长文本的md结构化

pdf超长合同或其他超100页非结构化文档&#xff0c;很难全量提交deepseek进行分析&#xff0c;一般需要先进行分割。然而&#xff0c;不管是langchain还是llamaindex提供的文本分割工具&#xff0c;很难直接对非结构化文本进行准确的内容分割&#xff0c;很多原始整体段落被划分…

介绍一个图像修复开源项目,从模糊到清晰仅需1.7秒:HYPIR图像修复技术如何改变数字世界?

文章概要 作为一名长期关注图像处理技术的爱好者&#xff0c;当我第一次接触到HYPIR这一革命性图像修复工具时&#xff0c;我被其惊人的速度和质量所震撼。本文将全面介绍由中国科学院深圳先进技术研究院董超研究员团队研发的HYPIR图像修复大模型&#xff0c;详细解析其核心技术…

基于UDP的SNMP协议

SNMP协议详解 SNMP (Simple Network Management Protocol)&#xff0c;“简单网络管理协议”&#xff0c;是广泛应用于TCP/IP网络中&#xff0c;用于管理和监控网络设备的一种标准协议。它允许网络管理员查询网络设备的状态信息、配置参数、接收故障告警等&#xff0c;从而实现…

3D空间中的变换矩阵

3D 空间中的变换矩阵详解 在 3D 计算机图形学中&#xff0c;所有几何变换都可以通过 44 齐次变换矩阵 来表示。以下详细介绍各种变换矩阵及其原理。 核心变换矩阵 1. 单位矩阵&#xff08;不变变换&#xff09; I[1000010000100001] I \begin{bmatrix} 1 & 0 & 0 &…

长连接(Long Connection)详解

一、长连接基本概念长连接&#xff08;也称为持久连接&#xff09;是指在一个TCP连接上可以连续发送多个HTTP请求/响应&#xff0c;而不是每次通信都建立新的连接。这是HTTP/1.1的默认行为&#xff0c;通过Connection: keep-alive头部实现。二、工作原理1. 传统短连接流程客户端…

【汇总】接口自动化测试 + 持续集成(文末视频演示)

技术栈&#xff1a;java testng httpclient allure fastjson jsonpath poi/yaml log4j 有建议请联系wx&#xff1a;ren168632201 java接口自动化系列(01)&#xff1a;自动化测试框架设计(入门版) java接口自动化系列(02)&#xff1a;测试数据文件设计(excel/yam) java接…

科研快报 |无人机+AI:广东防控基孔热背后的技术革命

Prism Path 科 研 快 报 CS跨学科顶尖期刊论文资讯 -NO.2025001- 人工智能在登革热预防、控制与管理中的作用&#xff1a;一项技术性叙述综述 The role of artificial intelligence for dengue prevention, control, and management: A technical narrative review 期刊…

常见的中间件漏洞

建议&#xff1a;启动下一个环境时&#xff0c;将上一个环境关闭&#xff0c;防止端口冲突和运行卡顿1.TomcatTomcat put方法任意文件写入漏洞Apache Tomcat 7.0.0 - 7.0.79 Apache Tomcat 8.5.19环境&#xff1a;cd vulhub-master/tomcat/CVE-2017-12615 docker-compose up -d…

7寸工业模组 XA070Y2-L01芯显科技详细参数资料

芯显7寸工业液晶屏 XA070Y2-L01 技术规格单 基础信息 项目 参数 制造商 芯显 型号 XA070Y2-L01 显示技术 a-Si TN TFT-LCD 应用场景 车载中控 / 工业HMI 屏幕尺寸 7.0英寸 机械结构 特性 指标 显示区域 152.4 91.44 mm 整机尺寸 165 104.09 9.1 mm 公差范围 0.5 mm 表面处理…

机器学习基础-numpy

一、相关知识点二、例子&#xff1a;import matplotlib.pyplot as plt import numpy as npplt.rcParams[font.sans-serif] [KaiTi] # 使用黑体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题math np.random.randint(low60,high100,size50) english np.rand…