2010-06-07 3 views
26

Je travaille avec l'API google maps et chaque fois que je renvoie la variable à la fonction initialize de la fonction codeLatLng, elle prétend qu'elle n'est pas définie. Si j'imprime la variable à partir du codeLatLng cela se montre bien.Comment renvoyer une variable à partir du rappel de géocodeur Google Maps JavaScript?

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    var addr = codeLatLng(); 
    document.write(addr); 

    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       return results[1].formatted_address; 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

imprime indéfinis

Si je fais:

var geocoder; 
    function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(); 


    } 

    function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
       document.write(results[1].formatted_address); 
      } else { 
      alert("No results found"); 
      } 
     } else { 
      alert("Geocoder failed due to: " + status); 
     } 
     }); 
    } 
    } 

imprime New York, NY 10012, États-Unis

Répondre

44

Vous ne pouvez pas retourner la valeur de la fonction, la valeur n'existe pas encore lorsque le retourne la fonction.

La méthode geocode fait un appel asynchonous et utilise un rappel pour gérer le résultat, donc vous devez faire la même chose dans la fonction codeLatLng:

var geocoder; 
function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    codeLatLng(function(addr){ 
    alert(addr); 
    }); 
} 

function codeLatLng(callback) { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
    geocoder.geocode({'latLng': latlng}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     if (results[1]) { 
      callback(results[1].formatted_address); 
     } else { 
      alert("No results found"); 
     } 
     } else { 
     alert("Geocoder failed due to: " + status); 
     } 
    }); 
    } 
} 
+0

est-il possible de renvoyer la valeur de addr? comment dois-je attribuer l'addr à une variable? – AbtPst

+0

@AbtPst: Vous ne pouvez rien retourner du résultat dans un appel asynchrone, car l'appel retourne avant qu'il y ait un résultat. Où j'ai placé le 'alert (addr);' est où vous pouvez utiliser le résultat.Il est possible d'affecter la valeur à une variable globale, mais vous devrez alors attendre que la valeur arrive. – Guffa

+0

oui, ce serait bien. En fait, j'ai un tableau de lat longues valeurs. Je veux traiter le tableau de manière itérative et continuer à ajouter l'adresse à une liste. en passant, y a-t-il un moyen d'inverser le géocodage d'un tableau de valeurs de latitude à la fois? et comment j'affecte l'addr à une variable globale? puis-je juste faire x = addr dans la fonction? – AbtPst

-2

Ce retour ne revient pas de codeLatLng; il revient de la fonction anonyme étant passé à geocoder.geocode.

Je pense que vous devrez transmettre les données en utilisant un autre mécanisme, par ex. une variable globale

0

passe le géocodeur en tant que paramètre à la fonction codeLatLng().

function codeLatLng(geocoder) { 

appel comme si dans votre fonction initialize:

var addr = codeLatLng(geocoder); 
11

Vous faites une requête asynchrone, votre fonction codeLatLng() est terminée et est retourné bien avant que le géocodage est fait.

Si vous avez besoin des données géocodeur continuer, vous devrez enchaîner vos fonctions ensemble:

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    codeLatLng(); 
} 
function codeLatLng() { 
    var latlng = new google.maps.LatLng(40.730885,-73.997383); 
    if (geocoder) { 
     geocoder.geocode({'latLng': latlng}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
        if (results[1]) { 
         initContinued(results[1].formatted_address); 
        } else { 
         alert("No results found"); 
        } 
       } else { 
        alert("Geocoder failed due to: " + status); 
       } 
     }); 
     } 

} 
function initContinued(addr) { 
    alert(addr); 
} 
1

La fonction geocode utilise un rappel (function(results, status) { ... }) qui est étant appelé lorsque la fonction geocode termine son travail. Ainsi, lorsque vous renvoyez une valeur à partir de ce rappel, il la renvoie uniquement à la fonction geocode, et non au codeLatLng.

Avec cela, vous avez plusieurs options: définir une variable dans codeLatLng et le mettre dans la fonction de rappel, par exemple:

function codeLatLng() 
{ 
    var returnValue; 
    geocoder.geocode({'latLng': latlng}, function(results, status) { returnValue = results[1].formatted_address }); 
    return returnValue; 
} 

Ou faire les choses dont vous avez besoin avec le résultat directement dans la fonction de rappel. Ou mettez le résultat dans une variable globale. (De plus, si la fonction est asynchrone geocode - si elle retourne immédiatement et le rappel est appelé par la suite, vous devez faire l'un des deux derniers, vous ne pouvez pas retourner la valeur de codeLatLng dans ce cas.)

+1

Votre exemple de code ne fonctionne pas. Lorsque la variable est renvoyée, sa valeur n'est pas définie, comme cela arrive plus tard dans la fonction de rappel. L'utilisation d'une variable globale permet de renvoyer la valeur, mais le problème est que le code n'obtient aucun signal lorsque la valeur est disponible dans la variable. La valeur n'est pas disponible immédiatement après l'appel de la fonction. – Guffa

+0

C'est pourquoi j'ai déclaré que si le géocode est asynchrone (je ne savais pas si c'était le cas) il devrait utiliser les deux autres méthodes, la variable globale ou faire les choses dans le rappel. Bien que j'admette n'avoir pas précisé qu'avec une variable globale, il ne recevrait aucun signal, il devrait donc vérifier périodiquement. –

Questions connexes