2016-01-12 2 views
0

Я пытаюсь найти город пользователя и назначить его глобальной переменной для дальнейшего использования. Я могу получить город, используя геолокацию и геокодер и предупреждая об этом. Моя проблема заключается в том, как ... как присвоить город возвращения глобальной переменной, поэтому я могу использовать ее за пределами функции getCity? Вот мой код, который будет предупреждать текущее местоположение города пользователя.Использование геолокации и геокодирования для определения местонахождения города пользователя и назначения его переменной

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 

<script type="text/javascript"> 
//get city fucntion 
function getCity() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(showPos); 
    } else { 
     x.innerHTML = "Geolocation is not supported by this browser."; 
    } 
} 

//callback function to get lat and long 
function showPos(position) { 

    // lat and long 
    var lat = position.coords.latitude; 
    var lng = position.coords.longitude; 

    //new geocoder to reverse geocoding 
    var geocoder = new google.maps.Geocoder(); 
    //set lat and long 
    var latlng = new google.maps.LatLng(lat, lng); 
    //get address 
    geocoder.geocode({ 
     'location': latlng 
    }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[0]) { 
       //get city 
       alert(results[0]['address_components'][2].long_name); 
      } 
     } 
    });//end geocoder callback 

}//end showPos callback 

getCity(); 

</script> 

Приведенный выше код будет предупреждать город пользователя. Теперь я хочу, чтобы город был назначен глобальной переменной, поэтому я могу использовать его для чего-то еще. Я попытался объявить переменную за пределами функции getCity() и присвоить ее results[0]['address_components'][2].long_name; такие как ...

var city; 
function getCity() { 
    city = results[0]['address_components'][2].long_name; 
} 
alert(city); 

Это ничего не значит. Может ли кто-нибудь дать мне несколько предложений?

+1

Вам необходимо использовать данные в обратном вызове, так как геокодер является асинхронным. Ваше предупреждение будет срабатывать до того, как данные будут возвращены. – charlietfl

+0

Может привести пример? Я не знаю, что вы подразумеваете под потреблением данных. Я попытался поместить все мои другие коды, которые используют результат «city» внутри обратного вызова, и он работает. Есть ли способ, которым я могу использовать результат вне обратного вызова? – lys916

+0

Нет .. вы не можете использовать его до тех пор, пока он не будет возвращен. – charlietfl

ответ

0

Если быть более точным, вы можете использовать его вне обратного вызова, но вы должны ожидания для обратного вызова были выполнены, так что ваша глобальная переменная теперь присваивается правильное значение.

Например, чтобы эти ситуации:

var city; 

function getCity() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(showPos); 
    } else { 
     x.innerHTML = "Geolocation is not supported by this browser."; 
    } 
    alert(city); // shows "undefined" when called the first time 
} 

function showPos(position) { 
    var lat = position.coords.latitude; 
    var lng = position.coords.longitude; 
    var geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(lat, lng); 

    geocoder.geocode({'location': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK && results[0]) { 
      //get city 
      city = results[0]['address_components'][2].long_name; 
      alert(city); // shows the found city. 
      showCity(); // shows the found city. 
     } 
    }); 
} 

getCity(); 

function showCity() { 
    alert(city); 
} 

showCity(); // shows "undefined" when called here. 

Пожалуйста, прочитайте сообщение от geocodezip рекомендованное в комментариях вопрос. Как только вы понимаете асинхронные задачи в JavaScript, все будет иметь больше смысла.

Смежные вопросы