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

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

相关文章

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring 请求之传递 JSON 数据的操作方法

《Spring请求之传递JSON数据的操作方法》JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换,这... 目录jsON 概念JSON 语法JSON 的语法JSON 的两种结构JSON 字符串和 Java 对象互转

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停