使用google chrome的console功能进行javascript测试,var r,i;
s=""//一堆用户名的数组
r=""
for(i = 0;i<10;i++){
    nova_request(function(response){
                    r=r+i+"|"
},'/user/chk/',{key: 'username',vo: s[i]},'get');
}r的结果10|10|10|10|10|10|10|10|10|10|希望r的结果0|1|2|3|4|5|6|7|8|9|javascript回调函数

解决方案 »

  1.   

    参考
    http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html中的第4部分
      

  2.   

    for(i = 0;i<10;i++){
    (function(x){
                nova_request(function(response){
                        r=r+x+"|"
                },'/user/chk/',{key: 'username',vo: s[x]},'get');
    })(i)
    }
      

  3.   

    感谢您们的回答!不过我想问下就是按照之前的代码,nova_request没有执行完,循环就继续下去了?
      

  4.   


    只有nova_request执行完毕才会进行下一次循环!
    楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。
      

  5.   


    只有nova_request执行完毕才会进行下一次循环!
    楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。累计起来的回调函数个数有没有上限?
      

  6.   


    只有nova_request执行完毕才会进行下一次循环!
    楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。累计起来的回调函数个数有没有上限?

    没有上下限之说,回调函数的个数=for循环的次数  
    你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10
      

  7.   


    只有nova_request执行完毕才会进行下一次循环!
    楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。累计起来的回调函数个数有没有上限?

    没有上下限之说,回调函数的个数=for循环的次数  
    你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10但是我这两天写一个程序的时候,for循环次数是18次,每次执行一个回调函数,函数结果写到一个全局数组里面。但是后面使用这个数组的时候里面总是只有11个左右的值,而如果每次执行回调函数的时候都加一个alert(),数组里的值就都有了,请问这个是什么情况?
      

  8.   


    只有nova_request执行完毕才会进行下一次循环!
    楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。累计起来的回调函数个数有没有上限?

    没有上下限之说,回调函数的个数=for循环的次数  
    你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10但是我这两天写一个程序的时候,for循环次数是18次,每次执行一个回调函数,函数结果写到一个全局数组里面。但是后面使用这个数组的时候里面总是只有11个左右的值,而如果每次执行回调函数的时候都加一个alert(),数组里的值就都有了,请问这个是什么情况?
    “回调函数的个数=for循环次数”这个是没有问题的,你加上alert能全部弹出也再次证明了。
    至于数组里不全,那说明数组或者数组处理上有问题~~最好贴下代码....
      

  9.   


    只有nova_request执行完毕才会进行下一次循环!
    楼主没有贴出nova_request的具体代码来,估计楼主在nova_request里有异步,那么:没有执行完的就不是nova_request,而是每次执行完nova_request进行回调的函数:function(response){...}。十次循环循环瞬间执行完毕后i值变成了10,而此时累计起来的10个回调才依次执行(异步需要与后台通信,回调函数需要等待响应才能执行,响应的过程中程序正常往下运行。因为这里的循环非常简单,所以在第一个回调响应之前10次循环就全部执行完了),因为i已经等于10,所以结果就会是你看到的“10|10|....”。累计起来的回调函数个数有没有上限?

    没有上下限之说,回调函数的个数=for循环的次数  
    你的for循环是for(i = 0;i<10;i++){..., 那么回调函数的个数当然就是10但是我这两天写一个程序的时候,for循环次数是18次,每次执行一个回调函数,函数结果写到一个全局数组里面。但是后面使用这个数组的时候里面总是只有11个左右的值,而如果每次执行回调函数的时候都加一个alert(),数组里的值就都有了,请问这个是什么情况?
    “回调函数的个数=for循环次数”这个是没有问题的,你加上alert能全部弹出也再次证明了。
    至于数组里不全,那说明数组或者数组处理上有问题~~最好贴下代码....
    function codeAddress() {
            var geocoder = new google.maps.Geocoder();
            var reLocation = new google.maps.LatLng();
            geocoder.geocode({ 'address': stationArr[j]}, function (results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
    locationArr[j] = results[0].geometry.location;
      }else{ 
    locationArr[j] = null;
      }
                j++;
                if (j < stationArr.length){
    codeAddress();
    }else{
    for(k=0;k<stationNum;k++){
    if(locationArr[k]==null)locationArr[k]=locationArr[k-1];
    }
    midN=Math.ceil(stationNum/2);
    var mapOptions = {
    center: locationArr[midN],
    zoom: 5,
    mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"),mapOptions);
    var lineCoordinates  = [locationArr
    // new google.maps.LatLng(39.929748,116.404052),
    // new google.maps.LatLng(34.374045,108.938842),
    // new google.maps.LatLng(31.292634,121.475401)
    ];
    var lineSymbol = {path: google.maps.SymbolPath.FORWARD_OPEN_ARROW};
    var line = new google.maps.Polyline({
      path: lineCoordinates,
      icons: [{icon: lineSymbol,offset: '100%'}],
      strokeColor: "#0000FF",
      strokeOpacity: 0.6,
      map: map
    });
    }
            });
        }
        codeAddress();功能就是将一个数组里面的地理位置进行编码,然后再地图上绘出折线位置超过11个后面的地理编码就不进行了,
      

  10.   

    发代码的时候先格式化一下吧~~不然看着很头疼
    stationArr这个参数值具体是啥?
    stationNum这个变量貌似也没有声明?