0

Я работаю с небольшим проектом javascript, который берет координаты, хранящиеся в файле xml/kml, и отображает их в пользовательском приложении Google Maps. У меня все работает так, как я хочу, кроме обратного геокодирования. Я могу отображать отформатированный адрес, когда я запускаю код внутри функции обратного вызова, но я не могу найти способ сохранить адрес для последующего использования (для динамических событий, таких как отображение полного адреса, когда пользователь нажимает на маркер).Получить адрес из обратного геокодированного обратного вызова

Есть ли способ сохранить адрес внутри функции обратного вызова, а затем получить его позже? Всякий раз, когда я пытаюсь, он говорит, что адрес не определен. Смотрите ниже:

var address; 
var geocoder = new google.maps.Geocoder(); 
var latlng = new google.maps.LatLng(lat, lng); 

geocoder.geocode({'latLng': latlng}, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      address = results[1].formatted_address; 
      alert(address); // this displays correctly 
     } 
     else { 
      alert("No results found"); 
     } 
    } 
    else { 
     alert("Geocoder failed due to: " + status);} 
    } 
); 

alert(address); // this displays 'undefined' 

ответ

1

Есть ли способ, чтобы сохранить адрес внутри функции обратного вызова, а затем получить его позже?

Да, но проблема в том, что вы не пытаетесь получить его позже. Вы пытаетесь получить его немедленно.

Позвольте мне объяснить. Как часто встречается в JavaScript, geocoder.geocode - асинхронный. Это означает, что он выполняет некоторую работу, и когда работа выполняется, он вызывает обратный вызов, но вот улов: он немедленно возвращается. Это означает, что когда вы делаете alert(address) на последней строке, geocoder.geocode все еще работает, ваш обратный вызов еще не был вызван, а address еще не установлен.

Решение должно работать с address внутри обратного вызова или (для организации) определить функцию, которую вы вызываете из обратного вызова для последующей работы.

+0

Благодаря @Jordan, я полагал, что это связано с тем, что обратный вызов является асинхронным. Я просто просто переписал код 'geocoder.gecode' в событие обработчика' click'. – Austin

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

  • Нет связанных вопросов^_^