2015-06-20 110 views
0

我已经看到了循环内循环需要等待回调的回调示例,我不知道如何将这些回答应用到我的脚本中。在双循环中回调

其实我有一个双循环,这样的:

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}); 
} 

谁能帮助?

回答

0

作为本地递归替代方法,这里有一个方法去做

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(); 
0

首先,你应该用方括号[]握住你的点,而不是curly那些

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

然后,你只需要使用递延/承诺概念,你的所有内部回调同步如下

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以获取更多信息

+0

你应该在你的答案中指出代码错误太:) - 你[编辑问题](http://stackoverflow.com/review/suggested-编辑/ 8519581)来解决 – James

+0

谢谢@詹姆斯的帮助:) – mshaaban