Problème de return dans une fonction

jims34 Messages postés 3 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 24 décembre 2010 - 13 nov. 2010 à 14:58
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 - 24 déc. 2010 à 13:18
Bonjour,

Tout d'abord je suis débutant avec javascript. Malgrè toutes mes recherches sur le web et mes divers essais, je ne suis pas arrivé à résoudre ce problème.

J'utilise google maps v3 pour afficher une carte sur mon site et faire divers traitements sur cette carte.

J'ai une fonction javascript à laquelle je demande de me renvoyer la latitude et la longitude d'une adresse passée en argument :

function codeAdresse(adresse) {
geocoder = new google.maps.Geocoder();
var address = adresse;
var sCoord = "Non init";
geocoder.geocode( { 'address': address}, function(results, status { if (status == google.maps.GeocoderStatus.OK) {
sCoord = results[0].geometry.location.toString();
} else {
alert("Geocode was not successful for the following reason: " + status);
sCoord = "Erreur";
}
});
return sCoord;
}

A l'appel de la fonction :

coord = codeAdresse("Labège, France")
je reçois "undifined"

Pourtant la ligne sCoord = results[0].geometry.location.toString(); est bien executée et renvoie bien une chaine contenant les coordonnées de l'adresse passée à la fonction. J'ai vérifié avec un alert(sCoord).
C'est bizarre parce que d'abord je reçois le "undifined" de retour et ensuite la fenêtre alert est affichée...

Qui peux m'aider à résoudre ce problème ?

Merci d'avance.

6 réponses

jdmcreator Messages postés 647 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 20 juillet 2012 7
14 nov. 2010 à 00:16
Hmmm... Lorsque que tu appelles ta fonction geocode, ton deuxième paramètre est une fonction :
...
geocoder.geocode( { 'address': address}, function(results, status { if (status == google.maps.GeocoderStatus.OK) {
...

Celle-ci est appelé indépendamment du reste de ta fonction, donc dans ta fonction codeAdresse, sCoord n'est pas défini.

Il te faut donc faire une fonction callback, c'est-à-dire une fonction qui sera appelé lorsqu'il aura l'adresse et où tu pourras continuer. Malheureusement pour toi, ta source sera plus complexe ^^

Essaie ceci :


/***

Ci dessous ta fonction callback qui sera appelé une fois le résultat connu

***/

function callback(adresse){
alert("Votre adresse (ou tout autre texte): "+adresse);
}
/* Le reste du code modifié */
function codeAdresse(adresse) { 
geocoder = new google.maps.Geocoder(); 
var address = adresse; 
var sCoord = "Non init"; 
geocoder.geocode( { 'address': address}, function(results, status { if (status == google.maps.GeocoderStatus.OK) { 
callback(results[0].geometry.location.toString()); 
} else { 
alert("Geocode was not successful for the following reason: " + status); 
callback("Erreur"); 
} 
}); 

} 


N'hésite pas à me demander des explications si ça ne fonctionne pas, si tu ne comprends pas ou si tu te poses des questions

JDMCreator
--------
Participez au nouveau projet : la wiki sur le javascript !
fr.jsinfo.wikia.com
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
14 nov. 2010 à 10:07
Bonjour,
visiblement il s'agit d'une fonction requête asynchrone donc il te faut exploiter le retour lorsque la requête est effective et disponible
function codeAdresse(adresse) {
  geocoder = new google.maps.Geocoder();
  var address = adresse;
  var sCoord = "Non init";
  geocoder.geocode({
    'address': address
  }, function (results, status {
    if (status == google.maps.GeocoderStatus.OK) {
      sCoord = results[0].geometry.location.toString();
      //-- Appel a une function qui traite le resultat     
      alert( sCoord);
    }
    else {
      alert("Geocode was not successful for the following reason: " + status);
      sCoord = "Erreur";
    }
  });
//  return sCoord; // NE SERT A RIEN
}

;O)
0
jims34 Messages postés 3 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 24 décembre 2010
22 déc. 2010 à 11:38
Bonjour,

Je reviens sur ce problème que j'avais mis de coté pour le moment... Merci pour vos réponses à tous les deux.

Le problème c'est qu'il faut que ma fonction retourne quelque chose à une autre fonction.

Est-ce que la fonction callback peut s'en charger ?

J'ai essayé ça :

function callback(adresse){
    return(adresse)
}


Mais évidement ça ne fonctionne pas...

Merci d'avance,

Jean-Michel
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
22 déc. 2010 à 13:02
Bonjour,
Est-ce que la fonction callback peut s'en charger ?
il te suffit d'appeler ta fonction dans la fonction callback, comme indiqué dans le code que je t'ai mis. Tu remplaces la fonction alert par ta fonction.
;O)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jims34 Messages postés 3 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 24 décembre 2010
24 déc. 2010 à 09:09
Bonjour,

Ce que je voulais dire c'est : est ce que la fonction callback peux faire le return vers la procédure qui appelle codeAdresse ?

J'ai essayé mais ça ne fonctionne pas.

Apparement cette fonction callback prend le relais sans faire de return ?

En tout ca merci, passez de bonnes fêtes.
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
24 déc. 2010 à 13:18
Ce que je voulais dire c'est : est ce que la fonction callback peux faire le return vers la procédure qui appelle codeAdresse ?
non, la fonction callBack s'exécute hors du contexte initial et ce termine on ne sait quand, ce que tu peux faire, comme on te la dit, c'est déclencher une fonction pour traitement du résultat.
Si tu veux faire le traitement à la suite de l'appel il te faut passer en mode synchrone, dans ce cas la fonction en cours attendra la fin du traitement pour continuer.
Mais est ce que l'API le permet, à voir.

;O)
0
Rejoignez-nous