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

标签 javascript arrays settimeout geocoding

所以,我正在测试一个脚本,该脚本将从数组中获取城市,然后使用地理编码找到它们的坐标,然后获取城市的邮政编码。好吧,这对于一个城市来说是可以的,但是对于一个数组来说,geoCode 有一个查询限制,所以我试图用 setTimeout 绕过它,但是由于我对 js 还不是很擅长,所以它不起作用。

<head>
    <div id= "test"></div>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

   <script type="text/javascript">

    function getLoc(){  
        var geocoder = new google.maps.Geocoder();
        var address = ["Helsinki", "Paris", "London"];
        for (var i = 0; i < address.length; 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);
        }
        }
        getLoc();
    function getZip(lat, long){
        var latlng = new google.maps.LatLng(lat, long);
        geocoder.geocode({
        'latLng': latlng
        }, function(results, status) {
            address = results[0].address_components;
            zipcode = address[address.length - 1].long_name;
            document.getElementById("test").innerHTML = zipcode;
        }); 
    }
</script>
</head>
<body>

</body>

最佳答案

 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 循环将在超时触发之前完成。所以在所有超时中我将始终是adress.length-1。您需要使用 IIFE 将 i 存储在每个超时范围内(可以查看“for 循环中的超时”)

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

关于javascript - 使用 settimeout 绕过地理编码查询限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41615999/

相关文章:

jQuery - 通过另一个事件停止延迟淡出

javascript - 带参数和 setTimeout 的 Vue js 方法

javascript - 如何将 2 个 javascript 变量组合成一个字符串

java - 二维数组多次移动选择排序

c - 在两个模块之间共享 sizeof(array)

Java集合列表: Converting from List '<Column <String1, String2>>' to 'List <String1>'

javascript - 如何在 react 中清除设置超时

javascript - AngularJS SPA和RestfulAPI服务器安全性

javascript 设置多个样式值

java - 谷歌地图与我的应用程序