Google maps api 3 谷歌地图API地理代码函数问题

Google maps api 3 谷歌地图API地理代码函数问题,google-maps-api-3,javascript,Google Maps Api 3,Javascript,好吧,我和你鬼混,我碰到了一个问题。我不知道这是API还是我犯的JS错误 问题: addMarkerFromAddress()函数调用geocodeFromAddress(),该函数将坐标返回到addMarkerFromAddress()。但返回值为“未定义” 作为调试,我添加了两个警报输出,一个在addMarkerFromAddress()中,另一个在geocodeFromAddress()中。让我烦恼的是addMarkerFromAddress()中的alert()似乎在返回任何值之前就触发

好吧,我和你鬼混,我碰到了一个问题。我不知道这是API还是我犯的JS错误

问题:
addMarkerFromAddress()
函数调用
geocodeFromAddress()
,该函数将坐标返回到
addMarkerFromAddress()
。但返回值为“未定义”

作为调试,我添加了两个警报输出,一个在
addMarkerFromAddress()
中,另一个在
geocodeFromAddress()
中。让我烦恼的是
addMarkerFromAddress()
中的
alert()
似乎在返回任何值之前就触发了。为什么?

来源:

<script type="text/javascript">
  var geocoder;
  var map;

  function initializeGoogleMaps() {

    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(0, 0);
    var myOptions = {
      zoom: 1,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

  }

  function geocodeFromAdress(address) {
   geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var latLng = results[0].geometry.location;
        alert(latLng); //Outputs coordinates, but is for some reason outputted 2nd
        return latLng;
      } else {
        alert("Geocode was not successful for the following reason: " + status);
      }
    });
  }

  function addMarkerFromAdress(address, title){

    var latLng = geocodeFromAdress(address); 
    alert(latLng); //Outputs "undefined", but is for some reason outputted 1st
    map.setCenter(latLng);
        var marker = new google.maps.Marker({
            map: map, 
            position: latLng
    });

  }

  window.onload = function () { 
   initializeGoogleMaps();
   addMarkerFromAdress('Berlin, Germany', 'Berlin');
  }
</script>

var地理编码器;
var映射;
函数初始化egooglemaps(){
geocoder=新的google.maps.geocoder();
var latlng=新的google.maps.latlng(0,0);
变量myOptions={
缩放:1,
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
}
map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
}
功能GeocodeFromAddress(地址){
geocoder.geocode({'address':address},函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
var latLng=results[0]。geometry.location;
警报(latLng);//输出坐标,但由于某种原因输出到第二个
返回板条;
}否则{
警报(“地理编码因以下原因未成功:“+状态”);
}
});
}
函数addMarkerFromAddress(地址、标题){
var latLng=地理编码FromAddress(地址);
警报(latLng);//输出“未定义”,但由于某种原因,第一个输出
地图设置中心(latLng);
var marker=new google.maps.marker({
地图:地图,
职位:latLng
});
}
window.onload=函数(){
初始化GeogleMaps();
AddMarkerFromAddress(“柏林,德国”,“柏林”);
}

是否看到该函数作为第二个参数传递给
geocoder.geocode()
?这就是您应该调用的
addMarkerFromAddress
。由于地理编码请求的异步性质,在
var latLng=geocodefromaddress(address)之后的
alert
在返回带有lat long值的响应之前触发

像这样的东西应该可以

<script type="text/javascript">
  var geocoder;
  var map;

  function initializeGoogleMaps() {

    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(0, 0);
    var myOptions = {
      zoom: 1,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

  }

  function geocodeFromAdress(address, title) {
   geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var latLng = results[0].geometry.location;
        addMarkerFromAdress(latLng, title);
      } else {
        alert("Geocode was not successful for the following reason: " + status);
      }
    });
  }

  function addMarkerFromAdress(latLng, title){
    map.setCenter(latLng);
    var marker = new google.maps.Marker({
        map: map, 
        position: latLng
    });   
  }

  window.onload = function () { 
   initializeGoogleMaps();
   geocodeFromAdress('Berlin, Germany', 'Berlin');
  }
</script>

var地理编码器;
var映射;
函数初始化egooglemaps(){
geocoder=新的google.maps.geocoder();
var latlng=新的google.maps.latlng(0,0);
变量myOptions={
缩放:1,
中心:拉特林,
mapTypeId:google.maps.mapTypeId.ROADMAP
}
map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
}
功能地理编码FromAddress(地址、标题){
geocoder.geocode({'address':address},函数(结果,状态){
if(status==google.maps.GeocoderStatus.OK){
var latLng=results[0]。geometry.location;
AddMarkerFromAddress(板条,标题);
}否则{
警报(“地理编码因以下原因未成功:“+状态”);
}
});
}
函数addMarkerFromAddress(板条,标题){
地图设置中心(latLng);
var marker=new google.maps.marker({
地图:地图,
职位:latLng
});   
}
window.onload=函数(){
初始化GeogleMaps();
地理编码FromAddress(“柏林,德国”,“柏林”);
}

所以我不能直接从geocoder获取坐标?我必须在同一个函数中使用它们,而不是按照您编写的方式。您可以从地理编码器获取坐标,但您不知道何时返回坐标,因此您需要编写代码,以便在返回坐标时,将坐标传递给
addmarkerfromAddress
函数,在地图上放置一个点。然后,我还可以将所有代码都放在
geocodefromAddress()
中?我仍然无法喘息,这就是为什么
addMarkerFromAddress()
geocodeFromAddress()
返回值之前继续执行。当然,我理解你的意思,这似乎是对的,但我仍然不明白:p这个请求是一个AJAX请求。你不知道它什么时候会被返回,但是当它返回时,你知道它的状态是什么,它是正常的还是在某种程度上出错了。这就是地位的意义。您可以用多种不同的方式编写代码,但基本上它的工作方式与您最初编写代码的方式不同,即
geocodefromaddress
在从geocode请求返回响应之前不会阻塞。您可以更改
geocodefromaddress
以获取在返回响应时调用的函数。这是同步操作和异步操作之间的区别。您可以在async设置为false的情况下发出AJAX请求,但我不建议这样做,因为在返回响应之前,整个UI都会被阻塞,这可能会给用户带来不稳定的体验。如果要知道lat long值而不需要调用
geocodefromaddress
,则可能需要将函数分开,只需将这些函数传递到
addmarkerfromaddress
:)