在双循环中回调
问题描述:
我已经看到了循环内循环需要等待回调的回调示例,我不知道如何将这些回答应用到我的脚本中。在双循环中回调
其实我有一个双循环,这样的:
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});
}
谁能帮助?
答
作为本地递归替代方法,这里有一个方法去做
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();
答
首先,你应该用方括号[
和]
握住你的点,而不是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以获取更多信息
你应该在你的答案中指出代码错误太:) - 你[编辑问题](http://stackoverflow.com/review/suggested-编辑/ 8519581)来解决 – James
谢谢@詹姆斯的帮助:) – mshaaban