Google Maps API задерживает загрузку переменной - PullRequest
0 голосов
/ 12 июля 2011

Я пытаюсь использовать API Карт Google для получения названия города из почтового индекса. Это не моя сила (я скорее специалист по PHP), поэтому я использую пример кода, который я нашел, с некоторыми изменениями, предложенными другом.

Проблема в том, что после вызова функции моя глобальная переменная с названием города все еще имеет начальное значение null. Однако, если я сообщу об этом значении, остальная часть обработки неожиданно загрузит правильное значение! Я попытался установить задержку, чтобы определить, не слишком ли медленно Google возвращает значение, но это не имеет значения.

Вот функция:

var geocoder = new google.maps.Geocoder();
function getGoogleAddress(zipcode) {
    //var gcity = "N/A"; switch to using global var defined above
    geocoder.geocode( { 'address': zipcode}, function (result, status) {
        for (var component in result[0]['address_components']) {
            for (var i in result[0]['address_components'][component]['types']) {
                if (result[0]['address_components'][component]['types'][i] == "locality") {
                    gcity = result[0]['address_components'][component]['short_name'];
                    break;
                }
            }
        }
    });
}

И вот откуда он вызывается ... включая предупреждение и паузу:

        gcity="";
        getGoogleAddress(form.zip.value);
        var holdcity = gcity;
        var date = new Date();
        var curDate = null;
        do { curDate = new Date(); }
        while(curDate-date < 2000);
        alert(gcity);

Как я уже сказал, предупреждение возвращает ноль, но остальная часть обработки имеет правильное название города в gcity. Если я пропущу предупреждение, остальная часть обработки завершится неудачно, потому что gcity имеет значение null.

Любые советы или предложения приветствуются. Спасибо.

1 Ответ

1 голос
/ 12 июля 2011

Асинхронный.

function (result, status) { выполняется только при ответе серверов Google.Остальная часть вашей getGoogleAddress функции не ждет этого, но завершается, и Javascript продолжает выполнение с var holdcity = gcity.

. Причина, по которой она работает после alert, заключается в том, чточто к тому времени Google ответит, и будет выполнена переменная gcity.

Возможное решение:

var geocoder = new google.maps.Geocoder();
function getGoogleAddress(zipcode, successFunction) {
    //var gcity = "N/A"; switch to using global var defined above
    geocoder.geocode( { 'address': zipcode}, function (result, status) {
        for (var component in result[0]['address_components']) {
            for (var i in result[0]['address_components'][component]['types']) {
                if (result[0]['address_components'][component]['types'][i] == "locality") {
                    var gcity = result[0]['address_components'][component]['short_name'];
                    successFunction(gcity);
                    break;
                }
            }
        }
    });
}

И вот откуда он вызывается ... включая оповещение ипауза:

    getGoogleAddress(form.zip.value, function (holdcity) {
        var date = new Date();
        var curDate = null;
        do { curDate = new Date(); }
        while(curDate-date < 2000);
        alert(holdcity);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...