我有以下代码,在其中尝试使用Google Maps Geocoding API将businesses
数组中的10-15个地址列表转换为lat / lng坐标。
var geocoder = new google.maps.Geocoder();
var proms = businesses.map(function(address) {
return prom = new Promise(function(resolve) {
geocoder.geocode({
address: address
}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
resolve({
results: results,
business: address
});
} else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
setTimeout(function() {
//HOW DO I RE-RUN THIS "new Promise"?
}, 1000);
} else {
console.log(status + ': ' + results);
}
});
});
});
Promise.all(proms);
问题是Google的API有时会返回
OVER_QUERY_LIMIT
错误,所以我想知道是否有办法重新运行在几秒钟后失败的承诺。在上面的示例中,else if
语句捕获了错误,因此如何使它在超时后重新运行?请注意,我刚刚开始使用Promise,但对它们的工作方式还没有很好的了解,因此我的方法可能是完全错误的。同样,所有这些操作都是在Google的API不会让我批量解析地址的前提下完成的,如果不是这种情况,请告诉我。
最佳答案
您可以将代码主体放入函数中,然后从计时器中再次调用它。注意:从技术上讲,这不是在重新运行Promise,而是在重新运行代码块,然后在完成时将解析Promise:
var proms = businesses.map(function(address) {
return prom = new Promise(function(resolve, reject) {
var retriesRemaining = 5;
function run() {
geocoder.geocode({
address: address
}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
resolve({
results: results,
business: address
});
} else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
--retriesRemaining;
if (retriesRemaining <= 0) {
reject(status);
} else {
setTimeout(run, 1000);
}
} else {
console.log(status + ': ' + results);
}
}
});
}
run();
});
});
Promise.all(proms);
仅供参考,我还添加了重试计数,因此代码永远不会陷入错误循环。
您可能也对此帖子感兴趣:How to avoid Google map geocode limit?。