Сохранить результат функции геокодирования Google Maps

Я хочу получить результат функции geocode() API Google Maps, чтобы использовать ее для других функций. Я поместил приведенный ниже код в событие OnClick для обратного геокодирования адреса точки, на которую нажали на карте.

Он всегда имеет предыдущее значение точки. Пример: в первый раз, когда я нажимаю, он имеет «неопределенное», во второй раз он имеет адрес точки, которую я щелкнул ранее, и так далее.

var address ;


my_listener = google.maps.event.addListener(map, 'click', function(event) {
   codeLatLng(event.latLng);
});

function codeLatLng(mylatLng) {

    geocoder = new google.maps.Geocoder();
    var latlng = mylatLng;

    geocoder.geocode({'latLng': latlng}, function(results, status) 
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {
            if (results[1]) 
            {
                address = results[1].formatted_address;
            }
        }
    });
    alert(address);
}

person Vassilis Barzokas    schedule 04.07.2012    source источник


Ответы (1)


Если вы переместите alert, внутри обратного вызова вы увидите новый адрес:

geocoder.geocode({'latLng': latlng}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) 
    {
        if (results[1]) 
        {
            address = results[1].formatted_address;
            alert(address);   //moved here
        }//   ^
    }//       |
});//         |  
//-------------

Процесс геокодирования асинхронный, поэтому в этом случае:

geocoder.geocode({'latLng': latlng}, function(results, status) {
    //We be called after `alert(address);`
});
alert(address);

alert будет выполнен до того, как данные геокодирования будут получены с сервера, и будет вызван обратный вызов function(results, status){}.

person Engineer    schedule 04.07.2012
comment
И как я могу сохранить значение address, чтобы использовать его в других функциях? - person Vassilis Barzokas; 04.07.2012
comment
@SportBilly Вы можете использовать его только после того, как данные будут получены с сервера. Это означает, что вам нужно вызвать свою функцию (которая должна выполнять некоторые действия по адресу) внутри обратного вызова function(results, status){}. - person Engineer; 04.07.2012
comment
Спасибо, но я не хочу вызывать функцию внутри функции геокодирования. Я хочу вызвать функцию, которая показывает результат. - person Vassilis Barzokas; 04.07.2012
comment
@SportBilly После строки address = results[1].formatted_address; напишите код, который показывает address. В чем проблема? - person Engineer; 04.07.2012
comment
Я хочу, чтобы переменная address была доступна более чем одной функции, и они не обязательно вызывались сразу после функции geocode. - person Vassilis Barzokas; 04.07.2012
comment
@SportBilly Затем выполнение этих функций должно быть продлено до тех пор, пока не будет получено address. Используйте очереди, логические значения, временные переменные и т. Д. ... - person Engineer; 04.07.2012
comment
@SportBilly, поддерживая слова инженера. Создайте глобальную переменную, которая будет обновлена ​​​​с адресом. Все остальные функции будут иметь к нему доступ и могут захотеть проверить его длину или что-то еще на случай, если они будут выполнены до завершения функции геокодирования. - person duncan; 04.07.2012