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

/**提交事件**/
$("#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. BZOJ1014 JSOI2008火星人(splay+哈希)

    splay维护哈希值即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstd ...

  2. BZOJ4569 SCOI2016萌萌哒(倍增+并查集)

    一个显然的暴力是用并查集记录哪些位之间是相等的.但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多. 于是考虑优化.使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][ ...

  3. Maven整理

    第一章 Maven安装 1.1 下载Maven库 下载地址:http://maven.apache.org/download.cgi 1.2 解压下载的库,认识Maven库目录 备注: 解压文件尽量不 ...

  4. Python入门基础之循环

    如果计算机不能循环,那么它比人还笨,实际上它也确实比人笨.你之所以觉得计算机好厉害,是因为它快,guangzhoushenbo.com计算机可以在1秒钟内重复做一件事情成千上万次. Python学习交 ...

  5. 架构师成长之路2.4-Kickstart文件剖析

    点击返回架构师成长之路 架构师成长之路2.4-Kickstart文件剖析 kickstart文件是一个简单的文本文件,它包含了一个项目列表,每个项目由一个关键字来识别. 创建kickstart文件注意 ...

  6. Prometheus-operator架构详解

    Prometheus是一个开源的系统监视和警报工具.一款非常优秀的监控工具.监控方案:Prometheus 提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案. Prometheus的关键特性 ...

  7. Centos6.5之ssh免密码登录配置

    Centos6.5之ssh免密码登录配置 centos ssh 免密码登录 0.说明 这里为了方便说明问题,假设有A和B两台安装了centos6.5的主机.目标是实现A.B两台主机分别能够通过ssh免 ...

  8. (转)Maven仓库——私服介绍

    背景:对Maven私服一直想做个深入的总结,因为不了解,所以感觉很陌生. 转载地址:http://blog.csdn.net/catoop/article/details/62312477 常用功能和 ...

  9. SQL Server解析XML数据的方法详解

    --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name=&q ...

  10. java代码示例(6-3)

    创建AdministratorTest.java /** * 需求分析:创建管理员对象 * @author chenyanlong * 日期:2017/10/15 */ package com.hp. ...