前端异步请求中后发先到的解决方案

2024-03-27 21:58

本文主要是介绍前端异步请求中后发先到的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通用的组件请求管理器,解决异步请求中的后发先到的问题

测试方法:可以使用fiddler进行测试,选择fiddler rules菜单中的automatic breakpoints中的afterResponse,这样可以阻止后端过快地返回,从而可以自己选择哪个请求的结果先返回,实现模拟后发先到的情况。

tips:每当需要取消之前发出的请求时,需要调用clearRequestId方法。

CommonRequestIdManager.js

/*通过id来跟踪请求和判断返回是否有效
*/
function CommonRequestIdManager() {if (!(this instanceof CommonRequestIdManager)) {return new CommonRequestIdManager();}this.initRequestId();}CommonRequestIdManager.prototype = {// id初始化initRequestId: function() {this.requestId = 0;},// 获取该次请求对应的idgetRequestId: function() {return this.requestId;},// 清除请求的id,把id加一,导致前面发出的请求不可用clearRequestId: function() {return this.addRequestId();},addRequestId: function() {return this.requestId++;},// 获取当前的请求idgetCurrentRequestId: function() {return this.getRequestId();},// 获取该次请求对应的回调getCb: function(cb,context) {var self = this;var requestId = this.getRequestId()console.log(requestId)return function(data) {// 对于返回的结果,判断回调函数绑定的id是否等于当前的请求idif (requestId === self.getCurrentRequestId()) {cb && cb.call(context || null, data);}}}}

测试页面

<!DOCTYPE html>
<html>
<head><title>my login</title><script type="text/javascript" src="jquery-1.10.2.js"></script>
</head>
<script type="text/javascript" src="./CommonRequestIdManager.js"></script>
<body><input type="text" name="name">submit<script type="text/javascript">var commonRequestIdManager = new CommonRequestIdManager();$('input').on('keydown', function() {// 清除前面发出的所有请求commonRequestIdManager.clearRequestId();$.ajax({url: '1.php',success:commonRequestIdManager.getCb(function() {console.log('success')}),error:commonRequestIdManager.getCb(function() {console.log('error')})})})</script>
</body></html>

优化版本:

/*通过id来跟踪请求和判断返回是否有效
*/
function CommonRequestIdManager() {if (!(this instanceof CommonRequestIdManager)) {return new CommonRequestIdManager();}// 是否已經取消了請求,如果是,則新建請求之前不需要再自增requestIdthis.hasCanceled = false;// 是否已經發送過請求this.haveEverMakeRequest = false;this.initRequestId();}CommonRequestIdManager.prototype = {// id初始化initRequestId: function() {this.requestId = 1;},// 获取该次请求对应的idgetRequestId: function() {return this.requestId;},// 清除请求的id,把id加一,导致前面发出的请求不可用,用於沒有發送新請求,但是通過其他操作取消了請求,比如點擊取消按鈕clearFormerRequest: function() {this.hasCanceled = true;this.addRequestId();  },/* 清除请求的id,把id加一,导致前面发出的请求不可用,用於發送新請求之前使用,如果已經通過其他操作取消了請求,或者還沒有發送過請求,則不需要再自增requestId。*/clearFormerRequestBeforeRequest: function() {if (!!this.hasCanceled || !this.haveEverMakeRequest) {return;}return this.addRequestId();  },addRequestId: function() {return this.requestId++;},// 获取当前的请求idgetCurrentRequestId: function() {return this.getRequestId();},// 获取该次请求对应的回调getCb: function(cb,context) {var self = this;var requestId = this.getRequestId();// 每次新發送請求之前重置標記位this.hasCanceled = false;this.haveEverMakeRequest = true;console.log(requestId)return function(data) {// 对于返回的结果,判断回调函数绑定的id是否等于当前的请求idif (requestId === self.getCurrentRequestId()) {cb && cb.call(context || null, data);}}}}

在优化版本中,显式定义了两种取消请求的方法,clearFormerRequest和clearFormerRequestBeforeRequest,后者用于在发送新的请求前使用,前者是没有发送新的请求,而是通过其他操作取消了请求,比如点击取消按钮。

这篇关于前端异步请求中后发先到的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853512

相关文章

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

kkFileView在线预览office的常见问题以及解决方案

《kkFileView在线预览office的常见问题以及解决方案》kkFileView在线预览Office常见问题包括base64编码配置、Office组件安装、乱码处理及水印添加,解决方案涉及版本适... 目录kkFileView在线预览office的常见问题1.base642.提示找不到OFFICE组件

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

MySQL逻辑删除与唯一索引冲突解决方案

《MySQL逻辑删除与唯一索引冲突解决方案》本文探讨MySQL逻辑删除与唯一索引冲突问题,提出四种解决方案:复合索引+时间戳、修改唯一字段、历史表、业务层校验,推荐方案1和方案3,适用于不同场景,感兴... 目录问题背景问题复现解决方案解决方案1.复合唯一索引 + 时间戳删除字段解决方案2:删除后修改唯一字