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

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

相关文章

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网