js中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结
想在点击"终端控制"的时候能够开启多个窗口对多个终端进行管理:
/**提交事件**/
$("#terminalControl").bind("click",function(){
$("#terminalControl").removeClass();
$("#terminalControl").addClass("btn_pointToPint " + $.cookie("color"));
var keyValue = $("#gridTable").jqGridRowValue("id");
var keyValueArray = keyValue.split(','),
len = keyValueArray.length;
for(var i = 0; i < len; i++){
var rowData = $("#gridTable").jqGrid('getRowData',keyValueArray[i]);
if(checkedRow(keyValueArray[i])){
$(this).attr("disabled","disabled");
$.ajax({
async:false,//必须设置为false,同步才行
url:'${basePath}/ptp/ptpAction_ipValid.do',
data:{ip:getcellTitle(rowData.ip)},
beforeSend:function(){
$("#terminalControl").attr("value",'<s:text name="cems.ptp"></s:text>');
},
success:function(responseText){
$("#terminalControl").attr("value",'<s:text name="cems.ok"></s:text>');
$("#terminalControl").removeAttr("disabled");
var obj = eval("(" + responseText + ")");
if(obj.result == "success" ){
var resourceId="";
$.each(top.authorizeMenuData,function(i,n){
if(n.text=="点对点控制"&&n.mark=="menu"||n.text=="ptpControl"&&n.mark=="menu"){
resourceId=n.id;
}
})
window.open("${basePath}/ptp/ptpAction_main.do?resourceId="+resourceId,"_blank"," toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes,location=no, status=yes",false);
}else if(obj.result == "multi"){
var ip = $("#ip_input").val();
dialogOpen({
id: "ptp",
title: "在线设备",
url: "/ptp/ptpAction_listUI.do?ip="+ip,
width: "500px",
height: "1000px",
offset:"rb",
btn:null
})
}
else if(obj.result == "connectServerFail"){
dialogMsg("连接服务器失败!",0);
}else if(obj.result == "analyzeError"){
dialogMsg("服务配置解析数据失败!",0);
}else if(obj.result == "notOnline"){
dialogMsg("该设备不在线!",0);
}else{
dialogMsg('<s:text name="cems.public.msgFail"></s:text>',0);
}
}
});
}
}
});
}
结果每次点开虽然开了多个窗口,但是每个窗口都是一样的,并没有达到开多个终端的页面的预期。
问题所在:for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,直到for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。
解决办法:只需要把ajax改成同步的就可以了,每次for循环,都要去加载ajax方法,并且拿到他返回的数据,只需要在ajax中间加一个代码就可以搞定了。async: false,//设置成同步。
1、设置ajax参数async为false,即与js同步,默认是true(异步)。
2、采用递归循环的方法解决此问题。
function func(times){
if(times <= 0){
return;
}
$.get(url,data,function(){
times --;
func(times); //递归调用
});
}
func(5);
接下来我在试试:
1、当async:false的时候,
2、当async:true的时候,
3、采用递归的方式:
/* 远程控制提交事件**/
$("#terminalControl").bind("click",function(){
$("#terminalControl").removeClass();
$("#terminalControl").addClass("btn_pointToPint " + $.cookie("color"));
var keyValue = $("#gridTable").jqGridRowValue("id");
var keyValueArray = keyValue.split(','),
len = keyValueArray.length,
i = 0;
doajaxmenu(keyValueArray,i,len);
}); function doajaxmenu(keyValueArray,i,len){
if(i >= len){
return;
}
var rowData = $("#gridTable").jqGrid('getRowData',keyValueArray[i]);
if(checkedRow(keyValueArray[i])){
$(this).attr("disabled","disabled");
$.ajax({
async:false,
url:'${basePath}/ptp/ptpAction_ipValid.do',
data:{ip:getcellTitle(rowData.ip)},
beforeSend:function(){
$("#terminalControl").attr("value",'<s:text name="cems.ptp"></s:text>');
},
success:function(responseText){
$("#terminalControl").attr("value",'<s:text name="cems.ok"></s:text>');
$("#terminalControl").removeAttr("disabled");
var obj = eval("(" + responseText + ")");
if(obj.result == "success" ){
var resourceId="";
$.each(top.authorizeMenuData,function(i,n){
if(n.text=="点对点控制"&&n.mark=="menu"||n.text=="ptpControl"&&n.mark=="menu"){
resourceId=n.id;
}
})
window.open("${basePath}/ptp/ptpAction_main.do?resourceId="+resourceId,"_blank"," toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes,location=no, status=yes",false); }else if(obj.result == "multi"){
var ip = $("#ip_input").val();
dialogOpen({
id: "ptp",
title: "在线设备",
url: "/ptp/ptpAction_listUI.do?ip="+ip,
width: "500px",
height: "1000px",
offset:"rb",
btn:null
})
}
else if(obj.result == "connectServerFail"){
dialogMsg("连接服务器失败!",0);
}else if(obj.result == "analyzeError"){
dialogMsg("服务配置解析数据失败!",0);
}else if(obj.result == "notOnline"){
console.log(i);
//dialogMsg("该设备不在线!",0);
}else{
dialogMsg('<s:text name="cems.public.msgFail"></s:text>',0);
}
i=i+1;
if(i < len){
doajaxmenu(keyValueArray,i,len);
}
}
});
}
}
js中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结的更多相关文章
- js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可)
js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可) 一.总结 ajax读取json和读取普通文本,和获 ...
- js中构造字符串若放入Grails中gsp的<g:link>标签出错
Grails的ajax使用json格式返回,在js中构造字符串时若放入<g:link>标签,字符串构造就会错误 如下就会发生错误,导致回调函数无法执行 function show(obj) ...
- Js中常用知识点(typeof、instanceof、动态属性、变量作用域)
1.Js中各类型的常量表示形式:Number:number String:string Object:objec 2.typeof运算符在Js中的使用:用于判断某一对象是何种类型,返回值 ...
- ajax post 请求 ,java端使用 request.getParameter 获取不到数据问题
js端 $.ajax({ type:'POST', data:{a:1}, url:_this.apiUrl+url, dataType:'json',//使用jsonp方式请求 contentTyp ...
- JS中的闭包(closure)
JS中的闭包(closure) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面就是我的学习笔记,对于Javascript初学者应该是很有用 ...
- js中如何返回一个存放对象的数组?
我这边需要返回后台数据的形式是这样的 {[ { ", }, { ", }, { ", }, { ", }, { ", } ]} 页面是通过循环去获取每 ...
- JS 中的require 和 import 区别整理
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...
- JavaScript基础&实战(5)js中的数组、forEach遍历、Date对象、Math、String对象
文章目录 1.工厂方法创建对象 1.1 代码块 1.2.测试结果 2.原型对象 2.1 代码 2.2 测试结果 3.toString 3.1 代码 3.2 测试结果 4.数组 4.1 代码 5.字面量 ...
- js中getBoundingClientRect的作用及兼容方案
js中getBoundingClientRect的作用及兼容方案 1.getBoundingClientRect的作用 getBoundingClientRect用于获取某个html元素相对于视窗的位 ...
随机推荐
- ubuntu 16.04 samba服务搭建
一:安装 1. sudo apt-get install samba 有询问Yes的地方Yes就行. 无法安装samba 执行 sudo apt-get update 2.等待安装完成,进入配置文件目 ...
- 51Nod 1048 1383 整数分解为2的幂
任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量! 比如N = 7时,共有6种划分方法. 7=1+1+1+1+1+1+1 =1+1+1+1+1+2 =1+1+1+2+2 ...
- sliding menu
http://www.androiduipatterns.com/2012/06/emerging-ui-pattern-side-navigation.htmlhttps://github.com/ ...
- WorkFlow基础实战
WorkFlow使用笔记---- 状态机工作流的使用: 1.首先,项目的目标框架要选择.Net4.5版本,才有状态机工作流. 2.新建“活动”项,先从工具栏拖出一个StateMachine,然后添加其 ...
- Luogu 1314 【NOIP2011】聪明的质检员 (二分)
Luogu 1314 [NOIP2011]聪明的质检员 (二分) Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有 ...
- 读入字符串/字符 scanf与getchar/gets区别
1. 读入字符 scanf/getchar:空格.Tab.回车都可以读入.但要以回车作为结束符. 所以当读入字符时,注意去掉一些干扰输入的字符,如空格和回车 2. 读入字符串 scanf:不能读入空格 ...
- echarts3地图如何添加点击事件? 点击地图相应的区域ajax获取并展示本区域省下面所有市的信息
myChart.on('click', function (params) { var city = params.name; loadChart(city); });
- 一次完整的 HTTP 请求过程
一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端, ...
- (注意格式,代替C++的getchar())汉字统计hdu2030
汉字统计 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- tcp的4次挥手、三次握手
1. TCP短连接模拟一种TCP短连接的情况:1. client 向 server 发起连接请求2. server 接到请求,双⽅建⽴连接3. client 向 server 发送消息4. serve ...