如何使用async.each方法发送相同集合的两个值?

时间:2016-07-30 19:15:58

标签: javascript async.js

我正在尝试使用谷歌距离矩阵api计算n个点之间的距离。

这是代码

var sum=0;
for(i=1;i < locations.length;i++){
var origin = locations[i-1];
var destination = locations[i];
var service = new google.maps.DistanceMatrixService;
    service.getDistanceMatrix({
      origins: [origin],
      destinations: [destination],
      travelMode: 'DRIVING',
      unitSystem: google.maps.UnitSystem.METRIC,
      avoidHighways: false,
      avoidTolls: false
    }, function(response, status) {
      if (status !== 'OK') {
        alert('Error was: ' + status);
      } else { 
        sum += response.rows[0].elements[0].distance.value;
      }
  });        
 }

但这不起作用。因为我的循环快速完成谷歌距离矩阵响应。我知道这是错的,它不会起作用。因此我决定使用我最喜欢的异步库async.js。但那我该怎么做呢?

origin = locations[i-1]  
destination = locations[i]. 

我只使用async.each获取该集合的单个元素,这是我选择的方法。我应该选择async.js的哪种方法来处理这些问题?或者我应该采用一些完全不同的方法来解决这个问题?

帮助表示赞赏 萨拉斯

修改
对于那些问我为什么这样做的人?我想像Uber为自己的应用程序准确计算距离,我正在为此收集大量数据点(实时位置坐标)。但我不知道他们如何准确地计算距离(另一种方式是方向API,但我发现它并不那么好)。我只能猜测他们正在使用距离矩阵API并将其应用于旅行中的100多个数据点以计算距离。

1 个答案:

答案 0 :(得分:1)

同步从数组中选择元素并将它们放在另一个数组中:

var legs = [];
for (var i=1; i<locations.length; i++)
    legs.push({origin:locations[i-1], destination:locations[i]});

然后,您可以使用您选择的async.js方法迭代该数组,可能是mapmapSeries,或者reduce如果你想做的就是求和距离。

async.map(legs, function(leg, cb) {
    service.getDistanceMatrix({
        origins: [leg.origin],
        destinations: [leg.destination],
        …
    }, cb);
}, function(err, responses) {
    …
})