Jquery 地理编码超过查询限制的解决方法

Jquery 地理编码超过查询限制的解决方法,jquery,google-maps,geocoding,Jquery,Google Maps,Geocoding,我正在尝试对1000多个地址进行地理编码,并将这些值存储在一个XML文件中。问题是在第十个地址之后,我得到了一个超过查询限制的错误。 我看到其他帖子建议在每个地理代码之间等待X秒,但这似乎对我不起作用。这是我的一段代码: <div id="locations"></div> $(xml).find('marker').each(function (i) { var storeName = $(this).attr('name'); var address

我正在尝试对1000多个地址进行地理编码,并将这些值存储在一个XML文件中。问题是在第十个地址之后,我得到了一个超过查询限制的错误。 我看到其他帖子建议在每个地理代码之间等待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);
});

$(xml).find('marker').each(函数(i)
{
var storeName=$(this.attr('name');
var address=$(this.attr('address');
setTimeout(函数(){
g、 地理编码(地址、功能(数据)
{
如果(数据!=null)
{
olat=数据纬度;
olng=data.longitude;
var标记=”;
$(“#位置”)。追加(标记);
} 
其他的
{               
//无法进行地理编码
警报('错误!无法对地址进行地理编码');
}
});
}, 1000);
});

首先是关于

不去想这样的事情很容易,但有时确实很重要。除非您想加入由于某种原因而禁用其服务的网站,否则请确保在对这些地址进行地理编码时向用户显示地图。TOS还禁止批量地理编码和存储结果,而不是性能缓存

不要指责!只是引起注意


程序员回答:

setTimeout
的回调和
geocode
都是异步函数。现在,在代码中,当响应仍然从API返回时,您将启动1秒计时器,该计时器也将异步运行,而您的循环将继续立即无延迟地迭代。一秒钟后,调用一次no op,然后丢弃它。每次循环运行时都会发生这种情况

因此,您一次就发出了上千个API请求。然后大约1秒钟后(几毫秒或几毫秒),1000次无操作将运行

您对
g.geocode
的调用需要在
setTimeout
的回调函数中,然后回调函数的结尾需要在其内部设置另一个超时,直到完成为止。没有更多的禁止行动


<>如果你想更正确地“绕过”<代码> OpjQuyRyLime错误和其他TOS限制(比如地理编码),你会考虑一个没有这样限制的商业服务,比如(披露:我在SAMYTYBALL)工作。

嗨,Matt。谢谢你的提醒。我正在尝试建立一个商店定位器,所以谷歌的服务条款应该不会有任何问题。我试着按照你的建议去做,但还是不行。我用这些更改更新了上面的代码。一次对一千多个地址进行地理编码?对我来说,这听起来有点笨重,但我想这不是由我来决定的;希望你能找到比其他人更多的财富!无论如何,您的代码不起作用,因为
每个
仍在毫无延迟地迭代。仔细检查
setTimeout
回调必须开始下一次迭代的部分;不要让每个人都从你身边跑掉。马特,谢谢你的快速回复。是的,我打算将坐标保存在xml中,以便能够显示用户位置附近的商店。它不仅能够在地图中的特定位置放置标记,还能够显示最近的商店。关于密码,你把我弄丢了。将each放在setTimeout中将一次触发1000个API请求,一旦完成,no op将运行。。。对吗?对不起,我会尽力澄清:
每个
都没有等待,因为
设置超时
一直在做它的事情。有两种很好的方法可以解决这个问题:要么需要控制调用下一个迭代的时间(现在它一直在进行),也许可以在
setTimeout
回调中设置一个新的超时。或者,正如我在其他地方看到的,您可以将ms的数量设置为
1000*I
,其中
I
是当前迭代的索引。然后你不必等待调用迭代,因为你的超时时间一直在延长。嗨,马特。是的,对不起。直到现在我才能够尝试它,这似乎奏效了!谢谢可能重复的