【问题标题】:google maps reverse geocoding: passing variables谷歌地图反向地理编码:传递变量
【发布时间】:2013-12-22 11:00:34
【问题描述】:

我正在尝试将与纬度、经度相对应的地址存储在变量中(在 javascript 中)。我创建了一个回调函数(在阅读了很多关于它的帖子之后),代码如下。现在我想将地址存储在一个名为 location3 的变量中。

奇怪的是,对于分配 location3 之后的警报,它是未定义的。但如果在 300 毫秒后查看它,那么它会给出正确的值。我想立即获得分配给 location3 的地址。欢迎提出任何建议。

  function codeLatLng1(lat,long,callback) {
  var geocoder = new google.maps.Geocoder();
  var latlng = new google.maps.LatLng(lat,long);
  if (geocoder) {
    geocoder.geocode({'latLng': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        if (results[1]) {
          callback(results[1].formatted_address);
          myvariable=results[1].formatted_address;
        } else {
          alert("No results found");
        }
      } else {
        alert("Geocoder failed due to: " + status);
      }
    });
  }
}


lat1_last=37;long1_last=-100;
codeLatLng1(lat1_last,long1_last,function(locat) {location3=locat;});
alert (location3); // THIS ALERT SHOWS THAT IT IS STILL UNDEFINED
setTimeout(function(){alert (location3);},300);  // THIS ALERT GIVES THE RIGHT ADDRESS

【问题讨论】:

    标签: google-maps reverse-geocoding


    【解决方案1】:

    这里要掌握的想法是 geocode() 的第二个参数,一个回调函数,不会立即被调用,而是只有在从 Google 收到结果后才会被调用。同时,发布请求的函数 codeLatLng1() 将控制权返回给调用者。在您的程序中,这意味着接下来会发生第一个 alert(),然后是一段等待时间,在此期间 Google 会回复您,调用回调,等等。

    同样,设置 location3 的匿名回调仅在收到结果时执行 - 而不是在 codeLatLng1 返回之前。

    将警报放在匿名回调中会更有意义。通常这是对结果进行最终处理的地方。

    这是一个异步或事件驱动编程的例子。

    我希望这说明清楚!

    【讨论】:

    • 嗨,埃里克,非常感谢您的建议。是的,警报在回调中运行良好,无需您建议的延迟。但是,我的目标是在信息框中使用变量“Location3”的值(我真的不需要警报)-如何将反向地理编码地址直接分配给“Location3”而无需延迟。再次感谢。
    • 您可以在回调中创建信息框。这是一种很好的编程风格。如果你必须提前创建它,让它不可见,然后让回调设置标签并使其可见。
    • 总会有延迟——您正在访问互联网!当您将大部分代码放在回调中时,您会发现它变得更加容易。尽管如此,它的麻烦多于它的价值,但是如果你想等到 location3 被定义,你需要一个循环来检查它是否仍然是未定义的每隔一段时间......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2014-04-06
    • 2015-07-27
    相关资源
    最近更新 更多