【发布时间】:2017-07-02 19:55:50
【问题描述】:
问题背景
我有一个包含纬度和经度值的数组。我有下面的代码,它为每次迭代放置一个标记。我正在使用 Ruby gem Gon 将值从数据库传递到 javascript。以下内容按预期工作:
function populateMap(map){
var index;
for (index = 0; index < gon.length; ++index) {
var latlng = new google.maps.LatLng(gon.murals[index].lat, gon.murals[index].long);
var marker = new google.maps.Marker({
position: latlng,
map: map
});
}
}
但是,我希望为每个带有地址的标记提供一个信息窗口。这是通过反向地理编码完成的。 https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse。
以下代码适用于反向地理编码 1 个标记:
function getReverseGeocodingData(geocoder, map, infowindow) {
var latlng = new google.maps.LatLng(gon.murals[0].lat, gon.murals[0].long);
geocoder.geocode({'location': latlng}, function(results, status) {
if (status === 'OK') {
if (results[1]) {
var marker = new google.maps.Marker({
position: latlng,
map: map
});
google.maps.event.addListener(marker, 'mouseover', function () {
infowindow.open(map, marker);
document.getElementById("address").innerHTML = results[1].formatted_address ;
});
} else {
window.alert('No results found');
}
} else {
window.alert('Geocoder failed due to: ' + status);
}
});
}
实际问题 当我将 for 循环添加到反向 geo0code 函数时,它只会放置最后一次迭代的标记。
function populateMapTest(map, geocoder, infowindow){
var index;
for (index = 0; index < gon.murals.length; ++index) {
var latlng = new google.maps.LatLng(gon.murals[index].lat, gon.murals[index].long);
alert("start of iteration: " + index);
geocoder.geocode({'location': latlng}, function(results, status){
alert("middle of iteration: " + index);
if (status === 'OK') {
if (results[1]) {
var marker = new google.maps.Marker({
position: latlng,
map: map
});
google.maps.event.addListener(marker, 'mouseover', function () {
infowindow.open(map, marker);
document.getElementById("address").innerHTML = results[1].formatted_address ;
});
} else {
window.alert('No results found');
}
} else {
window.alert('Geocoder failed due to: ' + status);
}
});
alert("end of iteration: " + index);
}
}
对于每次迭代,警报按以下顺序排列:迭代开始、迭代结束、迭代中间。它似乎正在跳过地理编码器括号中包含的代码,直到完成所有迭代。我想?
任何帮助表示赞赏。
【问题讨论】:
-
geocoder.geocode 似乎是异步的,因此中间迭代似乎总是在最后运行(例如,在“迭代结束”之后)。
标签: javascript ruby-on-rails ruby google-maps