问题描述:参数gidstr传过来2个数据,但是经过循环之后,if里边的arr里边的结果有时候事一个有时候是两个
如果在循环的开始加一段代码:alert("i:"+i); 就没问题,这是咋回事
function setData(gidstr){
//拆分gid集合
gidstr = gidstr.split(",");
//for循环赋值
var arr = new Array();
//先将要填充的数据排序,然后再循环赋值给select
$.each(gidstr,function(i,n){
recvMsgFunction.findPageByHQL(" and gid='"+n+"'",0,10, function(data){
arr[i] = "<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>";
//arr.push("<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>");
if(i == gidstr.length -1){
//append(arr);
$.each(arr,function(j,n){
//window.setTimeout("append("+arr+")", 500);
$("#faxNumVsat1").append(arr[j]);
});
/*
//alert(arr);
for(var j=0;j<arr.length;j++){
$("#faxNumVsat1").append(arr[j]);
}
*/
//$("#faxNumVsat1").append("<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>");
}
});
//alert("append:"+arr);
});
}
如果在循环的开始加一段代码:alert("i:"+i); 就没问题,这是咋回事
function setData(gidstr){
//拆分gid集合
gidstr = gidstr.split(",");
//for循环赋值
var arr = new Array();
//先将要填充的数据排序,然后再循环赋值给select
$.each(gidstr,function(i,n){
recvMsgFunction.findPageByHQL(" and gid='"+n+"'",0,10, function(data){
arr[i] = "<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>";
//arr.push("<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>");
if(i == gidstr.length -1){
//append(arr);
$.each(arr,function(j,n){
//window.setTimeout("append("+arr+")", 500);
$("#faxNumVsat1").append(arr[j]);
});
/*
//alert(arr);
for(var j=0;j<arr.length;j++){
$("#faxNumVsat1").append(arr[j]);
}
*/
//$("#faxNumVsat1").append("<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>");
}
});
//alert("append:"+arr);
});
}
$.each(arr,function(j,n)里面又有一个变量n,把这个n该为m吧。
//拆分gid集合
gidstr = gidstr.split(",");
//for循环赋值
var arr = new Array();
//先将要填充的数据排序,然后再循环赋值给select
$.each(gidstr,function(i,n){
recvMsgFunction.findPageByHQL(" and gid='"+n+"'",0,10, function(data){
arr[i] = "<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>";
//arr.push("<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>");
if(i == gidstr.length -1){
$.each(arr,function(j,m){
$("#faxNumVsat1").append(m);
});
}
});
});
}
本人已经解决问题,下面将描述解决细节供类似问题的参考:
1.将var arr = new Array();提到方法外边成为全局变量
2.将显示操作提取出另外作为一个方法function append(){
$.each(arr,function(j,m){
$("#faxNumVsat1").append(m);
});
return;
}3.在原来的方法中调用:window.setTimeout("append()", 500);
//拆分gid集合
gidstr = gidstr.split(",");
//for循环赋值
var arr = new Array();
//先将要填充的数据排序,然后再循环赋值给select
$.each(gidstr,function(i,n){
recvMsgFunction.findPageByHQL(" and gid='"+n+"'",0,10, function(data){
arr[i] = "<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>";
//arr.push("<option value='"+data[0].gid+"'>"+data[0].serialNumber.replace(".tif","")+"</option>");
if(i == gidstr.length -1){
$.each(arr,function(j,m){
$("#faxNumVsat1").append(m);
});
}
});
});
}除非你保证recvMsgFunction.findPageByHQL 不是异步的 否则 你的代码的执行次序的 不可控的
假定你有 2个 数据
你的函数 会产生 2次调用 arr[0]=??? arr[1]=???
如果是不可控次序 则 使得 执行 arr[1]=??时候 arr[0]=?? 还没有被调用
ok?
楼上说的确实是楼主代码的一个隐患 这种异步的操作线程执行顺序不可控