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

/**提交事件**/
$("#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. mysql关于binlog日志的操作

    查看binlog日志选项和存储位置: mysql> show variables like 'log_%'; 1.查看所有binlog日志列表 mysql> show master log ...

  2. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  3. LOJ121 动态图连通性(LCT)

    用LCT维护一下删除时间的最大生成树即可.当然也可以线段树分治. #include<iostream> #include<cstdio> #include<cmath&g ...

  4. BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)

    由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...

  5. John's trip POJ - 1041(这题数据有点水)

    题意: 其实还是一个欧拉回路,但要按字典序走路: 解析: 我真是蠢啊emm... map[i][j]表示由顶点i经街道j会到达的顶点编号 然后枚举j就好了 用栈储存.. 虽然我不是这样写的 #incl ...

  6. POJ3259(Wormholes) 判断负环

    题意: 农夫john发现了一些虫洞,虫洞是一种在你到达虫洞之前把你送回目的地的一种方式,FJ的每个农场,由n块土地(编号为1-n),M 条路,和W个 虫洞组成,FJ想从一块土地开始,经过若干条路和虫洞 ...

  7. 自学Python6.3-内置模块(1)

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  8. [luogu4568][bzoj2763][JLOI2011]飞行路线

    题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为00到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定 ...

  9. 用DBContext (EF) 实现通用增删改查的REST方法

    我们用ADO.NET Entity Data Model来生成实体类后,一般都会对这些类进行基本的增删改查操作,如果每个类都要写这些基本的方法,实在太乏味了.下面就是通过step by step的方式 ...

  10. Centos6.5的MySQL5.7.15二进制源码单机版安装

    0.说明 最近在CentOS6.5上安装mysql,想要知道具体的安装过程,不想要通过yum直接一键安装,折腾一番,但是总遇到些麻烦.于是将mysql文档中的关于如何在Linux上安装mysql的部分 ...