详解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 &amp; json的省市区联动代码
Jun 26 Javascript
ECMAScript6中Map/WeakMap详解
Jun 12 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
Jun 12 Javascript
[原创]jQuery常用的4种加载方式分析
Jul 25 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
js与jquery分别实现tab标签页功能的方法
Nov 18 Javascript
js自制图片放大镜功能
Jan 24 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
Apr 01 Javascript
vue子父组件通信的实现代码
Jul 09 Javascript
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
修改Vue打包后的默认文件名操作
Aug 12 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
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
深入理解PHP中的global
2014/08/19 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
mongodb和php的用法详解
2019/03/25 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
一篇不错的Python入门教程
2007/02/08 Python
Python中多线程的创建及基本调用方法
2016/07/08 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
python学生信息管理系统实现代码
2019/12/17 Python
会计专业毕业生求职信
2014/07/04 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
单身申明具结书
2015/02/26 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
JS class语法糖的深入剖析
2022/07/07 Javascript