javascript google maps Функция вызывающего объекта Geocoder завершается перед вызываемой функцией

Работаю геокодером на javascript. У меня есть функция с именем codeAddress, которая принимает адрес и правильно дает координаты. Однако, когда я вызываю эту функцию в другой функции, я не могу получить правильные результаты, потому что функция вызывающего абонента заканчивается перед функцией codeAddress. Вот мой код:

    var geocoder = new google.maps.Geocoder();
    var lokasyon ={ id:0,lat:0,lng:0 };
    var lokasyonlar=[];
    function codeAddress(adres, id) {
        geocoder.geocode({ 'address': adres }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                lokasyon.id = id;
                lokasyon.lat = results[0].geometry.location.lat();
                lokasyon.lng = results[0].geometry.location.lng();
                lokasyonlar.push(lokasyon);
                alert("codeAddress");
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        });
    }
    function trial2() {
        codeAddress("1.ADA SOKAK, ADALET, OSMANGAZİ, Bursa", 12);
        alert("trial2");
    }
    window.onload = trial2;

когда я запускаю этот код, сначала отображается «trial2», а затем «codeAddress». В чем причина этого?


person aldebaran    schedule 20.11.2012    source источник


Ответы (1)


Потому что метод geocoder.geocode() обращается к серверу Google, и это займет несколько секунд. Это означает, что метод geocode() является асинхронным, а alert("trial2") работает быстрее, чем обратный вызов.

Если вы хотите выполнить код 'alert("trial2")' после обратного вызова, вам нужно изменить это следующим образом:

function codeAddress(adres, id, callback) {
    geocoder.geocode({ 'address': adres }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            lokasyon.id = id;
            lokasyon.lat = results[0].geometry.location.lat();
            lokasyon.lng = results[0].geometry.location.lng();
            lokasyonlar.push(lokasyon);
            alert("codeAddress");
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
        callback();
    });
}
function trial2() {
    codeAddress("1.ADA SOKAK, ADALET, OSMANGAZİ, Bursa", 12, function(){
      alert("trial2");
    });
}
person wf9a5m75    schedule 20.11.2012