详解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类中定义原型方法的两种实现的区别
Mar 08 Javascript
利用jquery的获取JS文件中的字符串内容
Feb 14 Javascript
jquery ajax 简单范例(界面+后台)
Nov 19 Javascript
JS二维数组的定义说明
Mar 03 Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 Javascript
React实践之Tree组件的使用方法
Sep 30 Javascript
js使用xml数据载体实现城市省份二级联动效果
Nov 08 Javascript
Vue.js进阶知识点总结
Apr 01 Javascript
微信小程序canvas绘制圆角base64图片的实现
Aug 18 Javascript
layui 弹出层回调获取弹出层数据的例子
Sep 02 Javascript
详解微信小程序工程化探索之webpack实战
Apr 20 Javascript
手把手带你搭建一个node cli的方法示例
Aug 07 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写入数据库类代码分享
2011/07/26 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
PHP引用返回用法示例
2016/05/28 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
vue-router重定向不刷新问题的解决
2018/06/25 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Python实现八大排序算法
2016/08/13 Python
Python管理Windows服务小脚本
2018/03/12 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
构造方法和其他方法的区别
2016/04/26 面试题
高中政治教学反思
2014/01/18 职场文书
文案策划求职信
2014/03/18 职场文书
保健品市场营销方案
2014/03/31 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
市场营销工作计划书
2014/05/06 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
十佳党员事迹材料
2014/08/28 职场文书
股指期货心得体会
2014/09/10 职场文书
2015年国培研修感言
2015/08/01 职场文书