var geocoder, map, point, fmtAdd, marker;
function mapLoad() {
geocoder = new google.maps.Geocoder();
var myOptions = {
zoom: 15,
mapTypeControl: false,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById("map"), myOptions);
address="W3 6BY";
if(address){geocoder.geocode({'address':address}, geocodeResult);}
else{alert("Postcode Incorrect");window.close();}
}
function geocodeResult(results, status) {
if (status == 'OK' && results.length > 0) {
point=results[0].geometry.location;
map.setCenter(point);
marker = new google.maps.Marker({map: map, position: point, draggable: true});
geocoder.geocode({latLng:point},function(results, status){
if(status == 'OK') {
if(results.length == 0) {
fmtAdd = 'None';
} else {
fmtAdd = results[0].formatted_address;
}
} else {
fmtAdd = 'Error';
}
alert(fmtAdd); // shows the address
});
alert(fmtAdd); // says undefined;
} else {
alert("Error: " + status);
}
}
mapLoad();
我想显示来自英国的用户输入的格式化地址。但我不明白为什么第二个警报未定义?我没有在第一行定义变量“fmtAdd”吗?
答案 0 :(得分:1)
您的“第二个”警报实际上是您首先执行的第一个警报(geocode()
无阻塞 - 它立即返回)。
那时你“定义”fmtAdd
,但你没有初始化它。
var foo; alert(foo);
提醒undefined
。
回答评论:
我认为这是一个全局变量,一旦地理编码给出 它的值,我甚至可以从地理编码中检索该值 功能
这是对的。一旦传递给geocode()
的回调函数设置了一个值,该变量就被初始化。而这恰好发生了。 之后的“事件”,您可以在函数之外检索全局变量中的值。
这里的问题是,您尝试在回调函数完成(或甚至被调用)之前从fmtAddr
检索值。
这是因为geocode()
是非阻塞的。这意味着它会立即返回,这就是您将回调函数传递给geocode()
的原因。
参考代码的这一部分:
geocoder.geocode({ latLng: point }, function (results, status) {
if (status == 'OK') {
if (results.length == 0) {
fmtAdd = 'None';
} else {
fmtAdd = results[0].formatted_address;
}
} else {
fmtAdd = 'Error';
}
alert(fmtAdd); // shows the address
});
alert(fmtAdd); // says undefined;
按时间顺序:
geocode()
,将回传传递给它geocode()
向Google服务器启动异步请求并立即返回alert(fmtAdd); // says undefined;
fmtAddr
以正确的顺序执行您的申请:
fmtAdd
(实际上更好的方法是将格式化的地址作为参数直接传递给此函数,而不使用全局变量)