双循环回调
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();
我看过循环内的回调示例,其中循环需要等待回调,但我不知道如何将这些答案应用到我的脚本中。
我实际上有一个这样的双循环:
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();