2 votes

javascript google maps Geocoder la fonction caller se termine avant la fonction callee

Je travaille sur un géocodeur en javascript. J'ai une fonction nommée codeAddress qui prend l'adresse et donne les coordonnées correctement. Cependant, lorsque j'appelle cette fonction dans une autre fonction, je ne peux pas obtenir de résultats corrects parce que la fonction appelante se termine avant la fonction codeAddress. Voici mon code :

    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, OSMANGAZI, Bursa", 12);
        alert("trial2");
    }
    window.onload = trial2;

Lorsque j'exécute ce code, c'est d'abord "trial2" qui s'affiche, puis "codeAddress". Quelle en est la raison ?

1voto

wf9a5m75 Points 2709

Parce que la méthode geocoder.geocode() demande au serveur de Google, et cela prendra quelques secondes. Cela signifie que la méthode geocode() est asynchrone, et que alert("trial2") est plus rapide que le callback.

Si vous voulez exécuter le code 'alert("trial2")' après le callback, vous devez le modifier comme suit :

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, OSMANGAZI, Bursa", 12, function(){
      alert("trial2");
    });
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X