所以,我正在测试一个脚本,它将从数组中获取城市,然后通过地理编码找到它们的坐标,然后获取城市的拉链。嗯,这适用于一个城市,但是对于一个数组,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>
答案 0 :(得分:3)
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(可以在SO上查看“for循环中的超时”)
正如@iwrestledabearonce指出的那样,使用超时并不是一种优雅的方式。您可以一次使用多个打开请求,也可以一个接一个地使用多个打开请求。对于第一个,你不需要超时,而对于第二个,递归函数是一个更优雅的解决方案。
答案 1 :(得分:3)
您需要在封闭函数中包裹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);
}
没有关闭,i
中setTimeout
的{{1}}将始终是for
次迭代的值