循环中的异步函数javascript nodejs

时间:2015-07-15 22:11:39

标签: javascript json node.js google-maps httprequest

我需要扫描行程数组并计算当前行程与数组中每次行程之间的行程时间,并选择最短行程。为了计算,我需要发送google maps api call。

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

谢谢。

这次旅行在我的阵列列表中;

数组:

array=[trip1,trip2, trip3,....];

JS:

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


        });

}

1 个答案:

答案 0 :(得分:1)

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

1)您可以创建回调,以便收集结果并在所有结果都存在时进行比较。

2)你可以使用promises做同样的事情。

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

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

我不太清楚你正在使用什么库,如果它支持promises,但如果http.get返回一个promise,你可以通过将promises收集到一个数组中然后使用promise库来做#2 allwhen或类似内容会对正在完成的所有get附加回调。