Javascript 为什么我的地理代码不能显示地址

Javascript 为什么我的地理代码不能显示地址,javascript,google-maps-api-3,geocode,street-address,postal-code,Javascript,Google Maps Api 3,Geocode,Street Address,Postal Code,我想显示来自英国用户输入的格式化地址。但我不明白为什么第二个警报没有定义?我不是在第一行定义了变量“fmtAdd”吗?您的“第二个”警报实际上是您的第一个警报,因为它是首先执行的(geocode()是非阻塞的-它会立即返回)。 此时,您“定义”了fmtAdd,但没有对其进行初始化 var geocoder, map, point, fmtAdd, marker; function mapLoad() { geocoder = new google.maps.Geocoder(); var my

我想显示来自英国用户输入的格式化地址。但我不明白为什么第二个警报没有定义?我不是在第一行定义了变量“fmtAdd”吗?

您的“第二个”警报实际上是您的第一个警报,因为它是首先执行的(
geocode()
是非阻塞的-它会立即返回)。
此时,您“定义”了fmtAdd,但没有对其进行初始化

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();
警报
未定义


答复意见:

我认为这是一个全局变量,一旦地理代码给出 一个值,我甚至可以从地理代码中检索该值 功能

这是正确的。一旦传递给
geocode()
的回调函数设置了一个值,该变量就会初始化。而事实就是这样在该“事件”之后,您可以在函数之外从全局变量中检索值

这里的问题是,您试图在回调函数完成(甚至被调用)之前从
fmtAddr
检索值。
这是因为
geocode()
是非阻塞的。这意味着它会立即返回,这就是为什么要将回调函数传递给
geocode()

发生了什么 关于本部分代码:

var foo; alert(foo);
按时间顺序:

  • 调用
    geocode()
    ,并向其传递回调
  • geocode()
    启动对google服务器的异步请求并立即返回
  • 警报(fmtAdd);//表示未定义
  • 异步请求完成并调用回调函数
  • 您的回调函数设置
    fmtAddr
  • 你需要做什么 按正确的顺序执行应用程序:

    • 创建一个函数,该函数可以对格式化地址执行任何操作
    • 从回调函数调用此函数。也就是说,在设置
      fmtAdd
    (实际上最好将格式化地址作为参数直接传递给此函数,而不使用全局变量)

    您的“第二个”警报实际上是您的第一个警报,因为它是第一个执行的(
    geocode()
    是非阻塞的-它会立即返回)。
    此时,您“定义”了fmtAdd,但没有对其进行初始化

    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();
    
    警报
    未定义


    答复意见:

    我认为这是一个全局变量,一旦地理代码给出 一个值,我甚至可以从地理代码中检索该值 功能

    这是正确的。一旦传递给
    geocode()
    的回调函数设置了一个值,该变量就会初始化。而事实就是这样在该“事件”之后,您可以在函数之外从全局变量中检索值

    这里的问题是,您试图在回调函数完成(甚至被调用)之前从
    fmtAddr
    检索值。
    这是因为
    geocode()
    是非阻塞的。这意味着它会立即返回,这就是为什么要将回调函数传递给
    geocode()

    发生了什么 关于本部分代码:

    var foo; alert(foo);
    
    按时间顺序:

  • 调用
    geocode()
    ,并向其传递回调
  • geocode()
    启动对google服务器的异步请求并立即返回
  • 警报(fmtAdd);//表示未定义
  • 异步请求完成并调用回调函数
  • 您的回调函数设置
    fmtAddr
  • 你需要做什么 按正确的顺序执行应用程序:

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

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

    您应该使用您正在使用的编程语言和google maps api标记来标记您的问题。您应该使用您正在使用的编程语言和google maps api标记来标记您的问题。谢谢。但是我仍然不明白为什么地址没有保存在变量fmtAdd中,我认为它是一个全局变量,一旦地理代码给它赋值,我甚至可以从地理代码函数中检索该值。谢谢。但我仍然不明白为什么地址没有保存在变量fmtAdd中,我认为它是一个全局变量,一旦地理编码给它一个值,我甚至可以从地理编码函数中检索该值。