双循环回调

Callback in a double loop

我看过循环内的回调示例,其中循环需要等待回调,但我不知道如何将这些答案应用到我的脚本中。

我实际上有一个这样的双循环:

var marker = [{43.000,-79.321},...];
var result = [];

function test(){
    for(var i=0; i<marker.length;i++){
        result[i] =[];
        for(var j=0; j<marker.length;j++){
            drivingDistance(marker[i],marker[j],i,j,function(cb){
                result[cb.i][cb.j] = cb.distance;
            });
        }
    }
}

function drivingDistance(Point1,Point2,i,j,cb){
    cb({distance:'something',i:i,j:j});
}  

有人可以帮忙吗?

首先,您应该使用方括号 [] 来表示您的观点,而不是 curly

var marker = [[43.000,-79.321]]; // instead of [{43.000,-79.321}]
              ^              ^

然后,您只需使用 deferred/promise 概念来同步所有内部回调,如下所示

var marker = [[43.000,-79.321]];
var result = [];

function test(){
    var deferreds = [];

    for(var i=0; i<marker.length;i++){
        result[i] =[];
        for(var j=0; j<marker.length;j++){

            // add all your deferred instances returned by drivingDistance
            deferreds.push( drivingDistance(marker[i],marker[j],i,j) );
        }
    }

  $.when.apply(null, deferreds).then(function() {
    var cbs = arguments,
        cb
    ;

    for(var j = 0 ; j < cbs.length ; j++) {
      cb = cbs[j];
      result[cb.i][cb.j] = cb.distance;
    }

  }).done(function() {

      // You can safely print out the result array
      console.log(result);
  });

}

function drivingDistance(Point1,Point2,i,j,cb){

    var d = $.Deferred();

    d.resolve({distance:'something',i:i,j:j});

    return d;
}  

test();

有关详细信息,请参阅 jQuery.When

作为本机递归替代方案,这里有一种方法

var marker = [[43.000,-79.321],[44.000,-79],[45.000,-78],[46.000,-77]];
var result = [];
var i=0, j=0;

function test(){
    if(j >= marker.length){ j=0; i++; } // j is done one lap, reset to 0, i++ for next lap
    if(i >= marker.length){ return false; } // if there are no more laps, stop recursion
    if(j == 0){ result[i] = []; } // new lap, set result[i] as empty

    drivingDistance(marker[i],marker[j],i,j,function(cb){
        result[cb.i][cb.j] = cb.distance;
        j++; // increment j before next recursion
        test();
    });
}

function drivingDistance(Point1,Point2,i,j,cb){
    cb({distance:'something',i:i,j:j});
}

test();