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

How to send two values of the same collections with async.each method?

我正在尝试使用 google 距离矩阵 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;
      }
  });        
 }

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

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

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

感谢帮助
萨拉斯

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

Select 同步从数组中取出元素放到另一个数组中:

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) {
    …
})