2012-11-26 59 views
0

我有试图找到使用谷歌地图API地理编码地址的经度和纬度两个JavaScript函数未定义:JavaScript函数返回的不是数字

function getLatLon(address) { 
    var location = -1; 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      var lat = results[0].geometry.location.lat(); 
      var lon = results[0].geometry.location.lng(); 
      location = new Array(lat, lon); 
      //document.getElementById('results').innerHTML = location[0]; 
     } else { 
      alert("Geocode was not successful."); 
     } 
    }); 
    return location; 
} 

function search() { 
    var address = document.getElementById('address').value; 
    var location = getLatLon(address); 
    document.getElementById('results').innerHTML = location[0]; 
} 

虽然位置[0]内getLatLon()在#results div中打印出正确的数字,search()中的位置[0]返回undefined。你有什么想法,为什么会发生这种情况?我试过从getLatLon()返回一个纯字符串(“Hello”),而且工作得很好。

+5

geocoder.geocode是异步的吗?如果是,'getLatLon'应该总是返回-1。 *总是* – tjameson

+0

**呃**,我有一个问题。 getLatLon如何返回undefined? 'location'是'-1',所以它也应该返回'-1'。 –

+1

@Derek - 我认为问题是'location [0]'未定义而不是'getLatLon()'。问题措辞不佳的IMO。 – tjameson

回答

6

问题是geocoder.geocode(...)异步所以你不能返回一个值。尝试像这样代替:

function getLatLon(address, callback) { 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      var lat = results[0].geometry.location.lat(); 
      var lon = results[0].geometry.location.lng(); 
      location = new Array(lat, lon); 
      callback(location); 
     } else { 
      alert("Geocode was not successful."); 
     } 
    }); 
} 

function search() { 
    var address = document.getElementById('address').value; 
    getLatLon(address, function(location) { 
     document.getElementById('results').innerHTML = location[0]; 
    }); 
} 
+0

显然我需要更好地了解回调。谢谢! –

+0

对于任何有类似问题的人,这里是一个[文章](http://recurial.com/programming/understanding-callback-functions-in-javascript/),我用来理解回调。 –

2

the API docs,呼吁geocoder.geocode(request, callback_function)将返回什么的时候了。当收到并处理完响应后,将调用callback_function。在此之前,location将保留在您设置的任何值。

当您拨打getLatLon时,您需要在回拨功能中开始搜索。为了提高灵活性,您可以通过在geocode()回调函数中添加回调参数getLatLon来完成此操作。