首页 > 解决方案 > 如何在循环下一次迭代之前等待谷歌远程呼叫返回我的结果

问题描述

我有两个数组(gOriginsArray,gDestinationsArray),它们是数组数组,我在每个数组中存储 10 个地址,并且我有近 300 个起始地址和 300 个目标地址存储在一组 10 个条目中。我的 gOriginsArray 有 300 个相同的元素。我正在运行一个循环并从两个数组发送 10 个地址来计算距离,但我的循环在我从 DistanceMatrixService 获得结果之前继续进行,并且我也收到 OVER_QUERY_LIMIT 错误。

我想找到所有 300 个地址的距离,然后运行 ​​LoadBookingsArray(Records) 函数。

for (var k = 0; k < gDestinationsArray.length; k++) {
  var DistanceService = new google.maps.DistanceMatrixService();
  DistanceService.getDistanceMatrix({
    origins: gOriginsArray[k],
    destinations: gDestinationsArray[k],
    travelMode: google.maps.TravelMode.DRIVING,
    unitSystem: google.maps.UnitSystem.METRIC,
    avoidHighways: false,
    avoidTolls: false
  }, function(response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      var results = response.rows[0].elements;
      for (var l = 0; l < results.length; l++) {
        gDistanceArray.push(results[l].distance.text);
      }
    } else if (status === google.maps.DirectionsStatus.OVER_QUERY_LIMIT) {
      setTimeout(function() {
        console.log('OVER_QUERY_LIMIT');
      }, 10000);
    } else {
      console.log(status);
      gDistanceArray.push('');
    }
  });

}
LoadBookingsArray(Records);

在此处输入图像描述

我的带有 async/await 的更新版本

async function RunBookings() {
    for (var k = 0; k < gDestinationsArray.length; k++) {        
        let promise = new Promise(function(resolve, reject) {            
            var DistanceService = new google.maps.DistanceMatrixService();
            DistanceService.getDistanceMatrix({
                origins: gOriginsArray[k],
                destinations: gDestinationsArray[k],
                travelMode: google.maps.TravelMode.DRIVING,
                unitSystem: google.maps.UnitSystem.METRIC,
                avoidHighways: false,
                avoidTolls: false
            }, function(response, status) {
                if (status == google.maps.DirectionsStatus.OK) {
                    console.log(response);
                    var results = response.rows[0].elements; 
                    for (var l = 0; l < results.length; l++) {
                        gDistanceArray.push(results[l].distance.text);
                    }
                    resolve('Good promise');
                } else if (status === google.maps.DirectionsStatus.OVER_QUERY_LIMIT) {
                    console.log('OVER_QUERY_LIMIT');
                    console.log(response);
                    console.log(status);
                    reject(Error("Bad promise"));
                } else {
                    console.log('BAD');
                    console.log(response);
                    console.log(status);
                    reject(new Error("Bad promise"));
                }
            });
        });
        let result = await promise;
    }
}

标签: javascript

解决方案


我发现了这个问题。

在发送下一个请求之前,我必须等待 10 秒。

Google Maps Distance Matrix API 有以下限制(标准 API 的用户):每天 2,500 个免费元素。每个查询 100 个元素。每 10 秒 100 个元素。2016 年 1 月 18 日


推荐阅读