问题描述:参数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);
});
}

解决方案 »

  1.   

    $.each(gidstr,function(i,n)有一个变量n
    $.each(arr,function(j,n)里面又有一个变量n,把这个n该为m吧。
      

  2.   

    这个不是重点上面的代码略有错误,此处为最新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){
    $.each(arr,function(j,m){
                         $("#faxNumVsat1").append(m);
                     });
    }
    });
    });
    }
      

  3.   

    还是得靠自己啊!!!
    本人已经解决问题,下面将描述解决细节供类似问题的参考:
    1.将var arr = new Array();提到方法外边成为全局变量
    2.将显示操作提取出另外作为一个方法function append(){
    $.each(arr,function(j,m){
         $("#faxNumVsat1").append(m);
        });
        return;
    }3.在原来的方法中调用:window.setTimeout("append()", 500);
      

  4.   

    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){                    
                    $.each(arr,function(j,m){
                                $("#faxNumVsat1").append(m);
                            });
                }
            });
        });
    }除非你保证recvMsgFunction.findPageByHQL 不是异步的  否则 你的代码的执行次序的 不可控的
    假定你有 2个 数据 
    你的函数 会产生 2次调用   arr[0]=???   arr[1]=???
    如果是不可控次序 则 使得 执行 arr[1]=??时候  arr[0]=?? 还没有被调用
    ok?
      

  5.   

    DWR+JQ 有些意思~~~
    楼上说的确实是楼主代码的一个隐患 这种异步的操作线程执行顺序不可控