想在点击"终端控制"的时候能够开启多个窗口对多个终端进行管理:

/**提交事件**/
$("#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访问不到变量以及每次循环获取不到数据问题总结的更多相关文章

  1. js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可)

    js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可) 一.总结 ajax读取json和读取普通文本,和获 ...

  2. js中构造字符串若放入Grails中gsp的<g:link>标签出错

    Grails的ajax使用json格式返回,在js中构造字符串时若放入<g:link>标签,字符串构造就会错误 如下就会发生错误,导致回调函数无法执行 function show(obj) ...

  3. Js中常用知识点(typeof、instanceof、动态属性、变量作用域)

    1.Js中各类型的常量表示形式:Number:number     String:string    Object:objec 2.typeof运算符在Js中的使用:用于判断某一对象是何种类型,返回值 ...

  4. ajax post 请求 ,java端使用 request.getParameter 获取不到数据问题

    js端 $.ajax({ type:'POST', data:{a:1}, url:_this.apiUrl+url, dataType:'json',//使用jsonp方式请求 contentTyp ...

  5. JS中的闭包(closure)

    JS中的闭包(closure) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面就是我的学习笔记,对于Javascript初学者应该是很有用 ...

  6. js中如何返回一个存放对象的数组?

    我这边需要返回后台数据的形式是这样的 {[ { ", }, { ", }, { ", }, { ", }, { ", } ]} 页面是通过循环去获取每 ...

  7. JS 中的require 和 import 区别整理

    ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使 ...

  8. 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.字面量 ...

  9. js中getBoundingClientRect的作用及兼容方案

    js中getBoundingClientRect的作用及兼容方案 1.getBoundingClientRect的作用 getBoundingClientRect用于获取某个html元素相对于视窗的位 ...

随机推荐

  1. day6 字典

    字典的创建方式 注意 字典是无序的 1. dic{"name":"yang","age":35} 常用还是用这个 2. dic3 = dic ...

  2. MT【64】2017联赛一试不等式的一个加强练习

    已知$x_1,x_2,x_3\ge0,x_1+x_2+x_3=1$求 $$(x_1+3x_2+5x_3)(x_1+\frac{1}{3}x_2+\frac{1}{5}x_3)(x_1+x_3+3x_2 ...

  3. Centos7安装Zabbix4.0步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7安装Zabbix4.0步骤 官方搭建zabbix4.0的环境要求: 1. 环境搭建L ...

  4. Centos7下Zabbix3.4至Zabbix4.0的升级步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Centos7下Zabbix3.4至Zabbix4.0的升级步骤 查看现在centos版本和zab ...

  5. Shell基础知识(三)

    Shell中变量的作用域: 在当前Shell会话中使用,全局变量. 在函数内部使用,局部变量. 可以在其他Shell会话中使用,环境变量. 局部变量: 默认情况下函数内的变量也是全局变量 #!/bin ...

  6. poj3114 Contries in War (tarjan+dijkstra)

    缩完点后对每次询问做dijkstra即可 #include<cstdio> #include<cstring> #include<algorithm> #inclu ...

  7. Azure KeyVault设置策略和自动化添加secrets键值对

    一. 关于Azure Key Vault Azure 密钥保管库可帮助保护云应用程序和服务使用的加密密钥和机密. 借助 Key Vault,可使用密钥来加密密钥和机密(例如身份验证密钥.存储帐户密钥. ...

  8. A1044. Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  9. 从SVD到推荐系统

    最近在学习推荐系统(Recommender System),跟大部分人一样,我也是从<推荐系统实践>学起,同时也想跟学机器学习模型时一样使用几个开源的python库玩玩.于是找到了surp ...

  10. 函数和常用模块【day06】:re模块(九)

    本节内容 1.简述 2.常用的正则表达式符号 3.常用匹配方法 4.常用方法 5.反斜杠的困扰 6.其他匹配模式 7.总结 一.简述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程 ...