循环javascript节点中的异步函数

循环javascript节点中的异步函数,javascript,json,node.js,google-maps,httprequest,Javascript,Json,Node.js,Google Maps,Httprequest,我需要扫描行程数组,计算当前行程与数组中每次行程之间的行程时间,并选择最短的行程。对于计算,我需要发送谷歌地图api调用 我对异步回调函数感到非常困惑。 有人能帮我解决这个问题吗?如何在for循环中发送api调用,检查结果并继续 多谢各位 行程在我的数组列表中 数组: JS: 无法在循环中检查结果。循环是在过去,回调发生在未来-你不能改变这一点。你只能做两件事,一件是对另一件的抽象: 1您可以以这样的方式创建回调:当所有结果都存在时,回调将收集结果并进行比较 你可以用承诺做同样的事情 在适当修改

我需要扫描行程数组,计算当前行程与数组中每次行程之间的行程时间,并选择最短的行程。对于计算,我需要发送谷歌地图api调用

我对异步回调函数感到非常困惑。 有人能帮我解决这个问题吗?如何在for循环中发送api调用,检查结果并继续

多谢各位

行程在我的数组列表中

数组:

JS:


无法在循环中检查结果。循环是在过去,回调发生在未来-你不能改变这一点。你只能做两件事,一件是对另一件的抽象:

1您可以以这样的方式创建回调:当所有结果都存在时,回调将收集结果并进行比较

你可以用承诺做同样的事情

在适当修改代码中的cb调用时,1方法看起来像这样:

var results = [];
function cb(index, ttltimereturnoffice) {
  results.push([index, ttltimereturnoffice]);
  if (results.length == array.length) {
    // we have all the results; find the best one, display, do whatever
  }
}

我不太清楚您使用的是什么库,以及它是否支持承诺,但是如果http.get返回承诺,您可以通过将承诺收集到一个数组中来执行2,然后使用promise库的all或when或类似功能在all上附加回调即可。

如果我想使用数组中的元素并将其发送给api,然后检查第一个api响应,然后决定是否发送另一个api和数组中的下一个元素,我不能这样做?@ChloéLinHe你可以这样做,但这需要将请求链接到回调。函数cb{iftest{doAnotherQuery}},doAnotherQuery有cb回调。哦,对不起,我没有从你的问题中理解这一点。你当然可以做到;但在这种情况下,不能使用循环。我将在稍后草拟一个答案。编辑:@bcdan说得对。@bcdan谢谢,那么当我认为已经完成了内部循环中的api调用时,如何停止并返回到外部循环?@amadan谢谢。我正在努力学习如何使用承诺。但这很令人困惑。你能举例说明如何在循环中使用promise吗?我正在使用nodejs,我认为它支持promises,否则我可以使用promiseAPI或q库
function assigntrips(array){

var triplist = [];
for(var i=0; i< array.length; i++){

        var fstnode = array[i];
        for(var j=i+1; j<array.length; j++){
            //here i want to get the response from google api and decide if i want to choose the trip. 
           if not the for loop continues and send another api call.

        }

    }
}


function apicall(inputi, cb){
var destination_lat = 40.689648;
var destination_long = -73.981440;


var origin_lat = array[inputi].des_lat;
var origin_long = array[inputi].des_long;

var departure_time = 'now';

    var options = { 
            host: 'maps.googleapis.com',

            path: '/maps/api/distancematrix/json?origins='+ origin_lat    +','+origin_long+ '&destinations=' + office_lat + ',' + office_long + '&mode=TRANSIT&departure_time=1399399424&language=en-US&sensor=false'

        }

 http.get(options).on('response',function(response){
        var data = '';

        response.on('data',function(chunk){
            data += chunk;
        });
        response.on('end',function(){
            var json = JSON.parse(data);
            console.log(json);
            var ttltimereturnoffice = json.rows[0].elements[0].duration.text;
        //var node = new Node(array[i],null, triptime,0,ttltimereturnoffice,false); 
        //tripbylvtime.push(node);
        cb(ttltimereturnoffice + '\t' + inputi);
        });


        });

}
var results = [];
function cb(index, ttltimereturnoffice) {
  results.push([index, ttltimereturnoffice]);
  if (results.length == array.length) {
    // we have all the results; find the best one, display, do whatever
  }
}