1

我有一个问题,如果我将地理编码的结果放入一个变量中,该变量返回空。这是我的代码:

地图初始化:

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;
  }

现在,结果作为空字符串返回。但是,如果我要显示 results[0].geometry.location 的警报,它会显示我期望的正确值吗?

为什么它不想返回这个值?

4

2 回答 2

2

地理编码器是异步的。您不能从异步函数返回结果。您应该使用result回调内部的值。

更具体地说,正在发生的事情是您的return result;行实际上result是在分配变量之前执行的。

于 2013-04-13T21:38:04.880 回答
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 服务器返回响应后才被初始化。

于 2013-04-13T21:36:07.103 回答