在循环下一次迭代之前,我如何等待google距离调用返回我的结果

时间:2019-01-31 22:26:04

标签: javascript

我有两个数组(gOriginsArray,gDestinationsArray),它们是数组数组,我在每个数组中存储10个地址,我在一组10个条目中存储了将近300个原始地址和300个目的地址。我的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);

enter image description here

我的更新版本带有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;
    }
}

2 个答案:

答案 0 :(得分:2)

我发现了问题。

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

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

答案 1 :(得分:0)

看起来您正在遍历异步操作-DistanceService.getDistanceMatrix。 通过将gDestinationsArray循环包装在async函数中,并等待DistanceService.getDistanceMatrix完成,然后再移至下一个迭代,验证它是否返回Promise并重构代码以处理带有异步/等待的Promises。