我试图对超过1000个地址进行地理编码,并将这些值存储在一个XML文件中。问题是我在第十个地址之后得到一个OVER_QUERY_LIMIT错误。我看到其他帖子建议在每个地理编码之间等待X秒,但这似乎对我不起作用。这是我的一段代码,我试图在每一个地理编码之间等待X秒,但似乎对我不起作用。
<div id="locations"></div>
$(xml).find('marker').each(function (i)
{
var storeName = $(this).attr('name');
var address = $(this).attr('address');
setTimeout(function(){
g.geocode(address, function(data)
{
if(data != null)
{
olat = data.latitude;
olng = data.longitude;
var marker = "<marker name='" + storeName + "' lat='" + olat + "' lng='" + olng + "' />";
$('#locations').append(marker);
}
else
{
//Unable to geocode
alert('ERROR! Unable to geocode address');
}
});
}, 1000);
});
首先说明一下 谷歌的服务条款
不去想这种事很容易,但有时确实很重要。除非你想加入 本组 由于某些原因,他们的服务被禁用了,当你对这些地址进行地理编码时,请确保你向用户显示地图。服务条款也禁止批量地理编码和存储结果的任何其他性能缓存。
不是指责! 只是提请大家注意。
程序员回答。
setTimeout
"的回调和 geocode
都是异步函数。现在你的代码中,当响应还在从API传回来的时候,你正在启动你的1秒计时器,它也在异步运行,而你的循环继续立即迭代,没有延迟。一秒钟后,no-op被调用一次然后丢弃。每次循环运行时都会发生这种情况。
所以,你一次射出了一千个API请求。然后大约1秒后(给定或采取几毫秒),1000个no-op将运行。
你对 g.geocode
的回调函数中。setTimeout
,然后回调函数的结尾需要在里面再设置一个自己的超时,直到你完成。没有更多的no-op。
如果你想更正确地 "绕过 "回调函数,那么你就需要在回调函数中设置一个超时,直到你完成。OVER_QUERY_LIMIT
错误和其他TOS限制(如地理编码)。一窝蜂),你会想考虑一个没有这种限制的商业服务,如 美国街道地址API 披露:我在SmartyStreets工作)。