详解JavaScript for循环中发送AJAX请求问题


Posted in Javascript onJune 23, 2020

首先说,出现这个问题的场景是很少见的,因为有太多更好解决方法。今天搞ajax的时候,一个有趣的地方,,每个迭代中都要发送一个get请求,因为迭代的速度太快,一个请求还没有完成就进行下一个迭代,在chrome和ff上,除最后一个请求外,其它请求都被取消了。所以该怎么办呢?设置延时(不太好)还是其他办法?
 办法有很多,比如设置休眠,迭代等等, 我采用的是另外两种解决办法。

一、同步的ajax请求,而ajax请求默认是异步的,所以要设置为false。

function creatXMLHttpRequest() {
 var xmlHttp;
 if (window.ActiveXObject) {
 return xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 } else if (window.XMLHttpRequest) {
 return xmlHttp = new XMLHttpRequest();
 }
}
function disButton(name, actionName, resquestParmName) {
 var path = document.getElementById("path").value;
 var xmlHttp = creatXMLHttpRequest();

 var invoiceIds = new Array();
 invoiceIds = document.getElementsByName(name);
 // 迭代的速度快于发送请求+收到回复的时间 所以一次get请求都还没有完成就进行了下一次请求
 for (i = 0; i < invoiceIds.length; i++) { 
 var invoiceId = invoiceIds[i].value;
 var url = path + "/" + actionName + ".action?" + resquestParmName + "="
 + invoiceId;
 xmlHttp.onreadystatechange = function() {
 if (xmlHttp.readyState == 4) {
 if (xmlHttp.status == 200) {

  var result = xmlHttp.responseText;
  if (result == "0") {
  document.getElementById("btn" + invoiceId).disabled = "disabled";
  }
 }
 }
 }
 xmlHttp.open("GET", url, false);
 xmlHttp.send(null);
 } 
}

这样,用同步的ajax请求,就会等服务器响应后,执行完代码,再继续迭代。但是好像不推荐这样做。

详解JavaScript for循环中发送AJAX请求问题

二、采用异步的方式,但要记住,每次迭代都要创建一个新XMLHttpRequest对象,不能重用。

function creatXMLHttpRequest() {
 var xmlHttp;
 if (window.ActiveXObject) {
 return xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 } else if (window.XMLHttpRequest) {
 return xmlHttp = new XMLHttpRequest();
 }
}
function disButton(name, actionName, resquestParmName) {
 var xmlHttp;
 var path = document.getElementById("path").value;
 var invoiceIds = new Array();
 invoiceIds = document.getElementsByName(name);
 // 迭代的速度快于发送请求+收到回复的时间 所以一次get请求都还没有完成就进行了下一次请求
 for (i = 0; i < invoiceIds.length; i++) { 
 xmlHttp = creatXMLHttpRequest();
 var invoiceId = invoiceIds[i].value;
 var url = path + "/" + actionName + ".action?" + resquestParmName + "="
 + invoiceId;
 fu(xmlHttp,url,invoiceId);
 } 
}
function fu(xmlHttp,url,invoiceId){
 xmlHttp.onreadystatechange = function() {
 if (xmlHttp.readyState == 4) {
 if (xmlHttp.status == 200) {
 
 var result = xmlHttp.responseText;
 if (result == "0") {
  
  document.getElementById("btn" + invoiceId).disabled = "disabled";
 }
 }
 }
 }
 //
 xmlHttp.open("GET", url, true);
 xmlHttp.send(null);
}

由于JS的for循环与ajax非同步运行,因此导致for循环结束了而ajax却还未执行。如果采用的是异步请求的方式,如果每次迭代的时候都去new一个XMLHttpRequest,这样每次请求都能完成,但是结果还是还是不准确,有些程序还未被执行。
明白了,原来是每次迭代去执行几行代码,应该把发送ajax异步请求的代码放在一个函数中,每次迭代就去调用这个函数,这样就行了。

性能上,对于这种迭代ajax请求,似乎同步的方式性能更高。

详解JavaScript for循环中发送AJAX请求问题

这个问题解决了,也加深了对ajax、http的理解。

以上就介绍了JavaScript for循环中发送AJAX请求的问题,希望对Javascript教程有兴趣的朋友有所帮助。

Javascript 相关文章推荐
一个JS翻页效果
Jul 23 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
Jquery替换已存在于element上的event的方法
Mar 09 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
Aug 18 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
Nov 25 Javascript
使用jQuery实现的掷色子游戏动画效果
Mar 14 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
Mar 05 Javascript
JS截取字符串实例详解
Nov 24 Javascript
深究AngularJS中$sce的使用
Jun 12 Javascript
vue里面父组件修改子组件样式的方法
Feb 03 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
详解React路由传参方法汇总记录
Nov 29 Javascript
Jquery判断form表单数据是否变化
Mar 30 #Javascript
基于javascript实现tab选项卡切换特效调试笔记
Mar 30 #Javascript
javascript实现数字倒计时特效
Mar 30 #Javascript
基于javascript实现样式清新图片轮播特效
Mar 30 #Javascript
网页中JS函数自动执行常用三种方法
Mar 30 #Javascript
Jquery轮播效果实现过程解析
Mar 30 #Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 #Javascript
You might like
一个简单实现多条件查询的例子
2006/10/09 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
php文件缓存方法总结
2016/03/16 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
python用插值法绘制平滑曲线
2021/02/19 Python
构造器Constructor是否可被override?
2013/08/06 面试题
工程师岗位职责规定
2014/02/26 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书