Обратный адрес из Google Maps Geocoder v3

У меня есть следующая функция:

$(function() {
     var address = $("#address").text();
     var r;

     function encodeAddress() {
       geocoder = new google.maps.Geocoder();
       geocoder.geocode({'address' : address}, function(results, status) {
         if (status == google.maps.GeocoderStatus.OK) {
           results[0].geometry.location
           r = results[0].geometry.location
           console.log("inside:" + r);
         } else {
           alert("Google Maps had some trouble finding" + address + status);
         }
       });
     }

    encodeAddress()
    console.log("outside:" + r);
});

Я пытаюсь вернуть геокодированный адрес для использования в Просмотре улиц, а также в Gmap. Inside возвращает правильное значение, а external возвращает заниженное значение.

Мы очень признательны за любую помощь, я где-то читал, что вернуть значение таким образом невозможно, но мне пришлось проверить это в надежном сообществе StackOverflow.

Заранее спасибо.


person jeffreynolte    schedule 01.04.2011    source источник


Ответы (1)


Вы можете сделать это таким образом и вызвать функцию outputGeo внутри функции обратного вызова Geocode. По сути, вы обращаетесь к r перед обратным вызовом Geocode, и поэтому r все еще не определено:

$(function() {
     var address = $("address").text();
     var r;

     function encodeAddress() {
       geocoder = new google.maps.Geocoder();
       geocoder.geocode({'address' : address}, function(results, status) {
         if (status == google.maps.GeocoderStatus.OK) {
           results[0].geometry.location;
           r = results[0].geometry.location;
           outputGeo(r);
         } else {
           alert("Google Maps had some trouble finding" + address + status);
         }
       });
     }

    encodeAddress();
    function outputGeo(result){
         console.log("outside:" + result);
    }
});

Вот объяснение того, как работает служба геокодирования.

Доступ к службе геокодирования является асинхронным, поскольку API Карт Google должен выполнить вызов на внешний сервер. По этой причине вам необходимо передать метод обратного вызова для выполнения после завершения запроса. Этот метод обратного вызова обрабатывает результат(ы). Обратите внимание, что геокодер может вернуть более одного результата.

person KJYe.Name 葉家仁    schedule 01.04.2011
comment
Спасибо @kjy112, похоже, это очень близко к тому, что мне нужно. Он возвращает значение, но мне нужно использовать его вне функции encodeAddress(), так как это необходимо использовать в нескольких местах. Как мне использовать результат глобально? - person jeffreynolte; 01.04.2011
comment
@jnolte, вы можете поместить всю свою логику в функцию и вызвать ее после того, как геокод вернется в функцию обратного вызова, в то же время введя возвращаемые данные в ваш глобальный var r. По сути, вы не сможете получить доступ к r, пока не вернется геокод. - person KJYe.Name 葉家仁; 01.04.2011