我有一个问题,如果我将Geoencoding的结果放入变量,变量返回空。这是我的代码:
地图初始化:
function init_map() {
geocoder = new google.maps.Geocoder();
var center_address = get_long_lat("Salisbury, UK");
var latlng = new google.maps.LatLng(center_address);
var mapOptions = {
zoom: 8,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById("gmap"), mapOptions);
}
正如你所看到的那样,我试图通过使用自定义函数get_long_lat将地址转换为Long和Lat来获取地图中心到我的家乡:
获取长期&纬度
function get_long_lat(address) {
var result = "";
geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
result = results[0].geometry.location;
} else {
result = "Unable to find address: " + status;
}
});
return result;
}
现在,结果以空字符串形式返回。但是,如果我要显示结果[0] .geometry.location的警告,它会显示正确的值,我期待吗?
为什么不想返回这个值?
答案 0 :(得分:2)
地理编码器是异步的。您无法从异步函数返回结果。您应该在回调中使用result
值。
更具体地说,正在发生的事情是return result;
行在分配result
变量之前实际执行。
答案 1 :(得分:0)
geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {});
这段代码会调用Google服务器来检索地理编码信息。收到Google服务器的响应后,它会执行指定的回调函数。
return result;
在回调函数检索到信息之前,该行被命中,因此结果仍为空。检索信息时,将调用回调函数并填充结果。但是为时已晚,“get_long_lat”函数已经返回了结果,返回时仍然是空的。
问题是返回结果的回调函数是异步运行的。
如果你用这种方式写它会有用:
function init_map() {
geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': 'Salisbury, UK', 'region': 'uk' }, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var mapOptions = {
zoom: 8,
center: results[0].geometry.location,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById("gmap"), mapOptions);
} else {
//Do whatever you want to do when the address isn't found.
//result = "Unable to find address: " + status;
}
});
}
现在mapOptions仅在Google服务器返回响应后初始化。