js中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结
2017-08-17 09:24
906 查看
想在点击"终端控制"的时候能够开启多个窗口对多个终端进行管理:
结果每次点开虽然开了多个窗口,但是每个窗口都是一样的,并没有达到开多个终端的页面的预期。
问题所在:for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,直到for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。
解决办法:只需要把ajax改成同步的就可以了,每次for循环,都要去加载ajax方法,并且拿到他返回的数据,只需要在ajax中间加一个代码就可以搞定了。async: false,//设置成同步。
1、设置ajax参数async为false,即与js同步,默认是true(异步)。
2、采用递归循环的方法解决此问题。
接下来我在试试:
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; 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中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结
- 原生js如何实现柱状图以及原生js柱状图结合ajax循环动态数据_JavaScript_柱状图(原生JavaScript做的柱状图)(03)_ajax获取数据
- ajax请求获取的数据无法赋值给全局变量问题总结
- java后台设置可跨域访问,前端ajax获取json数据,解决浏览器限制跨域访问的问题
- 关于 ajax 动态返回数据 css 以及 js 失效问题
- Jquery 模板插件 jquery.tmpl.js 的使用方法(1):基本语法,绑定,each循环,ajax获取json数据
- javaweb-react的入门遇到的问题三:ajax获取数据与循环处理放入列表
- html中通过js获取接口JSON格式数据解析以及跨域问题
- volley 访问网络时候获取json数据发生乱码问题解决方法,以及gson解析json数据。
- Kindeditor通过JS提交获取不到数据问题.
- token获取不到,原来是数据格式的问题 要和后台的数据格式一致,$.ajax中contentType: “application/json” 的用法
- $.ajax获取不到数据问题解决
- MVC——应用Ajax获取不到数据问题解答
- js解决打印表单时获取不到填写的数据问题
- 关于超链接标签 a 里的属性调用js的问题 以及yii button里面调用cgridview 某一行数据
- JS 获取链接(url)参数以及锚链接(anchor)结合富ajax的应用(ajax前进/后退的问题)
- MVC——应用Ajax获取不到数据问题解答
- 类型:Ajax;问题:ajax调用ashx参数获取不到;结果:ashx文件获取$.ajax()方法发送的数据
- html中通过js获取接口JSON格式数据解析以及跨域问题