详解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 相关文章推荐
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
extjs每个组件要设置唯一的ID否则会出错
Jun 15 Javascript
js使用post 方式打开新窗口
Feb 26 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
discuz表情的JS提取方法分析
Mar 22 Javascript
php简单数据库操作类的封装
Jun 08 Javascript
jQuery实现简单的手风琴效果
Apr 17 jQuery
layui select获取自定义属性方法
Aug 15 Javascript
JS实现的input选择图片本地预览功能示例
Aug 29 Javascript
通过实例了解JS 连续赋值
Sep 24 Javascript
vue项目初始化到登录login页面的示例
Oct 31 Javascript
React 条件渲染最佳实践小结(7种)
Sep 27 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
PHP编程风格规范分享
2014/01/15 PHP
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
JS实现左右拖动改变内容显示区域大小的方法
2015/10/13 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
详解javascript void(0)
2020/07/13 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
element-ui中el-upload多文件一次性上传的实现
2020/12/02 Javascript
详解python3中zipfile模块用法
2018/06/18 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
Python unittest框架操作实例解析
2020/04/13 Python
python实现图像外边界跟踪操作
2020/07/13 Python
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
营销与策划应届生求职信
2013/11/04 职场文书
继承权公证书
2014/04/09 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
护理自荐信
2019/05/14 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB