Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用settimeout绕过地理编码查询限制_Javascript_Arrays_Settimeout_Geocoding - Fatal编程技术网

Javascript 使用settimeout绕过地理编码查询限制

Javascript 使用settimeout绕过地理编码查询限制,javascript,arrays,settimeout,geocoding,Javascript,Arrays,Settimeout,Geocoding,所以,我正在测试一个脚本,它将从数组中提取城市,然后用地理编码找到它们的坐标,然后得到城市的邮政编码。好的,这对一个城市来说是可行的,但是对于一个数组,地理代码有一个查询限制,所以我尝试用setTimeout绕过它,但是因为我对js还不太在行,所以它不起作用。 函数getLoc(){ var geocoder=new google.maps.geocoder(); var地址=[“赫尔辛基”、“巴黎”、“伦敦”]; 对于(变量i=0;i

所以,我正在测试一个脚本,它将从数组中提取城市,然后用地理编码找到它们的坐标,然后得到城市的邮政编码。好的,这对一个城市来说是可行的,但是对于一个数组,地理代码有一个查询限制,所以我尝试用setTimeout绕过它,但是因为我对js还不太在行,所以它不起作用。


函数getLoc(){
var geocoder=new google.maps.geocoder();
var地址=[“赫尔辛基”、“巴黎”、“伦敦”];
对于(变量i=0;i

用于(var i=0;i
for循环将在超时触发之前完成。因此,在所有超时中,我将始终是Address.length-1。您需要使用IIFE在每个超时范围中存储i(可以查看“for循环中的超时”等等)

正如@iwrestledabearon指出的,使用超时并不是一种优雅的方式。您可以一次使用多个打开的请求,也可以一个接一个地使用。对于第一个,您不需要超时,对于第二个,递归函数是一个更优雅的解决方案。

For(var i=0;i
for循环将在超时触发之前完成。因此,在所有超时中,我将始终是Address.length-1。您需要使用IIFE在每个超时范围中存储i(可以查看“for循环中的超时”等等)


正如@iwrestledabearon指出的,使用超时并不是一种优雅的方式。您可以一次使用多个打开的请求,也可以一个接一个地使用。对于第一个函数,您不需要超时,对于第二个函数,递归函数是一个更优雅的解决方案。

您需要在闭包函数中包装您的
setTimeout
,例如:

for (var i = 0; i < address.length; i++) {
    (function(i){
        setTimeout(function(i){ 
            geocoder.geocode( { 'address': address[i]}, function (results, status) {    
                if (status == google.maps.GeocoderStatus.OK) {
                    var lat = results[0].geometry.location.lat();
                    var long = results[0].geometry.location.lng();
                    alert(long);
                    getZip(lat, long);

                }
            });
        }, i* 1000);
    })(i);
}
for(变量i=0;i

如果没有闭包,则
setTimeout
中的
i
将始终具有上次
的值,用于
迭代

您需要在闭包函数中包装
setTimeout
,例如:

for (var i = 0; i < address.length; i++) {
    (function(i){
        setTimeout(function(i){ 
            geocoder.geocode( { 'address': address[i]}, function (results, status) {    
                if (status == google.maps.GeocoderStatus.OK) {
                    var lat = results[0].geometry.location.lat();
                    var long = results[0].geometry.location.lng();
                    alert(long);
                    getZip(lat, long);

                }
            });
        }, i* 1000);
    })(i);
}
for(变量i=0;i

如果不关闭
setTimeout
中的
i
将始终从上次
for
iterate

的值,我相信您看到的是lat,并且渴望最后一个城市“伦敦”?超时有效,但是它不经过第一个地理编码请求,不知道你的用例或数据集的大小,但是你可能想考虑编写一个服务器端的CRON作业,在后台获取数据(用适当的节流阀),并将其存储在数据库中。API限制对于实时批处理来说太低了,在客户端添加故意延迟可能会让访问者感到沮丧。@阿尔瓦罗·冈萨雷斯是的,我确实读过,但我不会在任何地方公开使用它,我只是为了让事情变得更简单。我还是可以试一下老太婆,只是为了好玩。谢谢你,我相信你看到LAT和长期的最后一个城市“伦敦”超时工作,但它没有经过第一地理编码请求不知道你的用例或你的数据集的大小,但你可能要考虑编写一个服务器侧的CRON作业,获取数据在后台(适当的节气门)并将其存储在数据库中。API限制对于实时批处理来说太低了,在客户端添加故意延迟可能会让访问者感到沮丧。@阿尔瓦罗·冈萨雷斯是的,我确实读过,但我不会在任何地方公开使用它,我只是为了让事情变得更简单。
for (var i = 0; i < address.length; i++) {
    (function(i){
        setTimeout(function(i){ 
            geocoder.geocode( { 'address': address[i]}, function (results, status) {    
                if (status == google.maps.GeocoderStatus.OK) {
                    var lat = results[0].geometry.location.lat();
                    var long = results[0].geometry.location.lng();
                    alert(long);
                    getZip(lat, long);

                }
            });
        }, i* 1000);
    })(i);
}