2011-10-20 48 views
0

我想使用鈦reverseGeocoder,但我有一個奇怪的問題,我認爲是一個「範圍」問題。我不明白爲什麼當我定義了該範圍內的變量時,我所做的最後一次日誌調用返回空值。加速器鈦 - 反向地理編碼器和可變範圍問題

var win = Titanium.UI.currentWindow; 
Ti.include('includes/db.js'); 

var city = null; 
var country = null; 

Titanium.Geolocation.reverseGeocoder( Titanium.UI.currentWindow.latitude, 
             Titanium.UI.currentWindow.longitude, 
             function(evt) { 

var places = evt.places; 

if (places && places.length) { 
city = places[0].city; 
country = places[0].country;  
} 
Ti.API.log(city + ', ' + country); // <<< RETURNS CORRECT VALUES 

}); 

Ti.API.log(city + ', ' + country); // <<< RETURNS NULL VALUES 
+0

儘管它看起來是異步的,但是它不會使用那個庫,所以它會給它一個與ajax調用完全相同的行爲。請看這個問題剛剛關閉:http://stackoverflow.com/questions/7833379/scope-of-javascript-variable – davin

+0

這是一個類似的情況,我需要一種方法來只分配變量一旦geocoder已完成。 – bagwaa

+0

你嘗試過在設備上還是在使用模擬器? –

回答

1

這是Davin解釋的異步調用。您必須在反向地理編碼功能中調用一個函數。

我可以給你的建議是基於事件的。創建活動和消防活動。一個例子:

Titanium.UI.currentWindow.addEventListener('gotPlace',function(e){ 
    Ti.API.log(e.city); // shows city correctly 
}); 

Titanium.Geolocation.reverseGeocoder( Titanium.UI.currentWindow.latitude, 
             Titanium.UI.currentWindow.longitude, 
             function(evt) { 

    var city, country, places = evt.places; 

    if (places && places.length) { 
     city = places[0].city; 
     country = places[0].country;  
    } 
    Ti.API.log(city + ', ' + country); // <<< RETURNS CORRECT VALUES 
    Titanium.UI.currentWindow.fireEvent('gotPlace',{'city': city, 'country': country}); 
}); 
+0

謝謝,這很有用 - 我最終確定我的電話是在活動中。 – bagwaa