【问题标题】:Why my geocode cannot show the address为什么我的地理编码无法显示地址
【发布时间】:2012-07-14 09:58:06
【问题描述】:
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”吗?

【问题讨论】:

  • 你应该用你正在使用的编程语言和google maps api标签来标记你的问题。

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


【解决方案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() 向谷歌服务器发起异步请求并立即返回
  3. alert(fmtAdd); // says undefined;
  4. 异步请求完成并调用您的回调函数
  5. 你的回调函数设置fmtAddr

你需要做什么

以正确的顺序执行您的应用程序:

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

(其实更好的是直接把格式化后的地址作为参数传给这个函数,不使用全局变量)

【讨论】:

  • 谢谢。但是我还是不明白为什么地址没有保存在变量 fmtAdd 中,我以为它是一个全局变量,一旦 geocode 给它一个值,我甚至可以从 geocode 函数中检索到那个值。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多