0

我正在尝试将与纬度、经度相对应的地址存储在变量中(在 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
4

1 回答 1

0

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

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

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

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

我希望这能说清楚!

于 2013-07-09T23:26:22.700 回答