невозможно изменить глобальную переменную в JavaScript - PullRequest
0 голосов
/ 20 января 2019

var address ="<%= params[:search] %>";
var lat;
var long;
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
	lat = results[0].geometry.location.lat();
	long = results[0].geometry.location.lng();
}); 
alert(lat);
//wanna use lat and long here!

браузер всегда предупреждает "undefined" при вызове вне функции, работает при вызове из функции.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Функция geocoder.geocode является асинхронной и получает широту и долготу внутри функции обратного вызова - после завершения асинхронной операции. Только тогда определяются переменные lat и long.

Ваше оповещение запускается сразу после запуска асинхронной операции, то есть оно еще не завершено к моменту срабатывания оповещения Итак, lat и long все еще не определены.

Вы не можете использовать широту и долготу за пределами блока обратного вызова. Переместите его внутрь блока обратного вызова, и он будет работать:

var address ="<%= params[:search] %>";
var lat;
var long;
var geocoder = new google.maps.Geocoder();
geocoder.geocode( { 'address': address}, function(results, status) {
    lat = results[0].geometry.location.lat();
    long = results[0].geometry.location.lng();
    // you can use lat and lng inside here! :)
    alert(lat);
});

Прочтите этот пост, если вы хотите лучше понять асинхронный код в JavaScript: https://stackoverflow.com/a/14220323/2401947

0 голосов
/ 20 января 2019

Привет Ашутош Гупта ,

это происходит потому, что ваш alert() происходит до назначения переменной. Вы можете использовать Promise для решения этой проблемы, например

var address ="<%= params[:search] %>";
var lat;
var lng;
var geocoder = new google.maps.Geocoder();

new Promise((resolve, reject) => {
geocoder.geocode( { 'address': address}, function(results, status) {
    lat = results[0].geometry.location.lat();
    lng = results[0].geometry.location.lng();
    resolve({lat: lat, lng: lng});
}));
}).then((data) => {
    alert(data);
});
...