Не удалось вернуть Geocode latLng - PullRequest
1 голос
/ 17 апреля 2011

Я создал функцию для возврата широты и долготы.
Проблема в том, что alert('outside:') срабатывает раньше geocoder.geocode.

Глядя на этот похожий пример ,эта функция должна работать.

 function getLatLng(geocoder, adr) {
    var latLng = '';
    geocoder.geocode({ 
      address: adr}, function(results, status){
        if (status == google.maps.GeocoderStatus.OK && results.length) {
          latLng = results[0].geometry.location;
          alert('inside: ' + latLng); // This works
        } 
      }
    );
    alert('outside: ' + latLng); // This shows NULL
    return latLng;
 }

Так что мне нужно, чтобы вернуть значение latlng?

Ответы [ 2 ]

5 голосов
/ 17 апреля 2011

Вы увидите, что этот шаблон часто используется в JavaScript для асинхронных операций - второй аргумент geocode() - это функция обратного вызова, которая вызывается, когда заканчивается потенциально дорогостоящая и долгоживущая операция геокодирования.Если бы вызов был синхронным, он заблокировал бы вашу веб-страницу и любой другой код JavaScript, пока он не вернется.

Небольшой недостаток использования асинхронных функций заключается в том, что они возвращаются немедленно, поэтому вы не можете использовать return для возврата значения;точно так же, как вы узнали в своем примере геокодирования - вызов geocode() немедленно возвращается без результата и работает в фоновом режиме, вызывая функцию обратного вызова с фактическим результатом через некоторое время.

Одним из решений будетсамостоятельно указать функцию обратного вызова при вызове getLatLng:

function getLatLng(geocoder, adr, myCallback){
    var latLng = '';
    geocoder.geocode({
                address: adr
            }, 
            function(results, status){
                if (status == google.maps.GeocoderStatus.OK && results.length) {
                    latLng = results[0].geometry.location;
                    if(myCallback){
                        myCallback(latlng);
                    }
                }
            });
}
0 голосов
/ 17 апреля 2011

Это асинхронная функция, вы не можете сделать это

...