2010-11-30 42 views
3

好的,我已经在jQuery应用程序中设置Google地图。 (V3)。我可以整天地理地图代码。在Javascript中了解地理编码

所以,我认为我会很聪明,并将实际的地理编码功能移到一个函数中。

这里是我使用的功能:

 

    function geocode(address) { 
     var self = this; 
     geocoder.geocode({ 'address': address }, function(results, status) { 
      console.log(status); 
      if (status == google.maps.GeocoderStatus.OK) { 
       return results[0].geometry.location; 
      } else { return null; } 
     }); 
     return "WTF?"; 
    } 

的“跆拳道”是一个笑话,你会看到一个时刻。

现在,后来在我的代码,我尝试调用函数像这样:

 
var start_latlng; 
start_latlng = geocode(start_address); 

console.log(start_latlng); 

我得到控制台是:

 
WTF? 
OK 

公告的“跆拳道”是BEFORE即使我在该功能中打印“确定”,“确定”。 (console.log(状态))

我的猜测是因为地理编码需要一点时间才能返回并且函数在返回第一个地理编码值之前继续。

有没有人有任何建议,如何改善这个,使我的“start_latlng”包含预期值?

感谢您的指点。

*编辑**

这里是我落得这样做。

我调用该函数像这样:

 
     geocode(start_address, function(data) { 
      start_latlng = data; 
      console.log(start_latlng);   
     }); 

这里是新的功能(没有完成,但你的想法)

 
    function geocode(address, callback) { 
     geocoder.geocode({ 'address': address }, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       callback(results[0].geometry.location); 
      } 
      else { 
       callback("Error"); 
      } 
     }); 
    } 

就像一个魅力。 :-)

感谢您的提示,并帮助我认为更好。

回答

3

什么geocode()期望是一个回调函数作为它的参数。这意味着它的调用结果将被传递到您指定的函数,当它准备好时,这是异步的,而不是作为return的值。

function geocode(address) { 
    geocoder.geocode({ 'address': address }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      /* do whatever you need to do with the results here */ 
     } 
     else { 
      /* handle the error */ 
     } 
    }); 
} 
1

地理编码器似乎异步工作,所以结果并不令人惊讶。我的意思是,执行流过地理编码器调用点,因此函数返回,随后地理编码器返回其结果 - 这就是为什么按照该顺序得到输出的原因。