1

我正在尝试对 1,000 多个地址进行地理编码并将值存储在 XML 文件中。问题是我在第十个地址之后收到了 OVER_QUERY_LIMIT 错误。我已经看到其他帖子建议在每个地理编码之间等待 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);
});
4

1 回答 1

3

首先是关于Google 服务条款的说明

不去想这样的事情很容易,但有时它确实很重要。除非您想从今天早些时候加入该组,但由于某种原因他们的服务被禁用,请确保在对这些地址进行地理编码时向用户显示地图。TOS 还禁止批量地理编码和存储性能缓存以外的任何结果。

不是指责!只是引起注意。


程序员回答:

setTimeout的回调和geocode都是异步函数。现在使用您的代码,虽然响应仍然从 API 返回,但您正在启动 1 秒计时器,该计时器也异步运行,同时您的循环继续立即迭代,没有延迟。一秒钟后,no-op 被调用一次,然后被丢弃。每次循环运行时都会发生这种情况。

因此,您一次可以处理一千个 API 请求。然后大约 1 秒后(给定或花费几毫秒),将运行 1,000 个无操作。

您的调用g.geocode需要在 的回调函数中setTimeout,然后回调函数的末尾需要在其中设置另一个超时,直到您完成为止。没有更多的无操作。

如果您想更正确地“解决”OVER_QUERY_LIMIT错误和其他 TOS 限制(例如整体地理编码),您将需要考虑没有此类限制的商业服务,例如LiveAddress(披露:我在 SmartyStreets工作)。

于 2012-08-09T00:47:54.050 回答