javascript - 如何在循环下一次迭代之前等待谷歌远程呼叫返回我的结果
问题描述
我有两个数组(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;
}
}
解决方案
我发现了这个问题。
在发送下一个请求之前,我必须等待 10 秒。
Google Maps Distance Matrix API 有以下限制(标准 API 的用户):每天 2,500 个免费元素。每个查询 100 个元素。每 10 秒 100 个元素。2016 年 1 月 18 日
推荐阅读
- android - 在 android 的 textview 或 webview 中呈现 *%{color:orange}Hello !!%* 的方法是什么
- javascript - 在存储中添加记录后绑定存储不反映值
- android - 键盘可见时显示底部导航
- c# - Signal R 多个 Web API 请求
- javascript - 如何将多选组件中的默认值传递给另一个 vue-multiselect
- java - 如何以编程方式获取所有正在运行的应用程序的列表
- android - Androids : 如何从 google play store 下载 APK 文件
- django - 连接()到 unix:///tmp/uwsgi_dev.sock 失败(111:连接被拒绝),同时连接到上游
- apache-spark - 如何控制 Delta Lake 合并输出中的文件编号
- mysql - 从结果组结果的 MAX 的结果中更新所有字段