为什么我的地理编码无法显示地址

时间:2012-07-14 09:58:06

标签: javascript google-maps-api-3 geocode street-address postal-code

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”吗?

1 个答案:

答案 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;

按时间顺序:

  1. 您致电geocode(),将回传传递给它
  2. geocode()向Google服务器启动异步请求并立即返回
  3. alert(fmtAdd); // says undefined;
  4. 异步请求完成并调用您的回调函数
  5. 您的回调函数设置fmtAddr
  6. 你需要做什么

    以正确的顺序执行您的申请:

    • 创建一个函数,它可以对格式化的地址执行任何操作。
    • 从回调中调用此函数。也就是说,在设置fmtAdd
    • 之后

    (实际上更好的方法是将格式化的地址作为参数直接传递给此函数,而不使用全局变量)