2012-11-26 80 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來完成此操作。