IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

APIs Google Discussion :

ordre d'appel de fonction


Sujet :

APIs Google

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut ordre d'appel de fonction
    Bonjour,
    Mon projet est de créer un site, où via un formulaire, on rajoute des adresses dans une base de donnée, qui sont ensuite afficher sur une autre page avec une googlemap. Bref, je sais pas si c'est très clair...
    Mon problème est le suivant. J'aimerais tester sur mon formulaire, si tout les champs sont remplis, et ensuite si l'adresse existe, en utilisant geocoder.
    Mon problème est que geo.getLocations(search, function (result)... semble être appelé après les différentes boucles if. Donc lorsque je test l'état de la variable statut, c'est l'ancienne valeur qui est utilisé, de même pour la variable error qui me permet d'enregister le message d'erreur.
    Donc quand j'envoie mon formulaire, je recois un premier message d'alerte sur l'adresse qui était écrite avant sur mon formulaire, et un message d'alerte qui est correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <script language="JavaScript">
    	var statut;	
    	var error;
     
    function GetAdress(){
    	// ====== Array for decoding the failure codes ======
    	var reasons=[];
    	reasons[G_GEO_SUCCESS]            = "Success";
    	reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
    	reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
    	reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
    	reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
    	reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
    	reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
     
    	var geo = new GClientGeocoder(); 
    	var search = document.mail_form.champ1.value +','+ document.mail_form.champ2.value+','+ document.mail_form.champ3.value;
     
    	// ====== Perform the Geocoding ======    
    	geo.getLocations(search, function (result)
    	{ 
    	// If that was successful
    	if (result.Status.code == G_GEO_SUCCESS) {
    		//alert('Could find');
    		statut=true;
    	}
    	else{
    		var reason="Code "+result.Status.code;
    		if (reasons[result.Status.code]) {
    			reason = reasons[result.Status.code]
    		} 
    		alert('Could not find "'+search+ '" ' + reason);  //message afficher en 2nd
    		error='Could not find "'+search+ '" ' + reason;
    		statut=false;
    		}
    	}
    	);
     
    	if(!verifSelection()) return false;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    function verifSelection(){
    	if (document.mail_form.champ1.value == "") {
    	alert("Bad Street")
    	return false
    	} 
    	if (document.mail_form.champ2.value == "") {
    	alert("Bad City")
    	return false
    	} 
    	if (document.mail_form.champ3.value == "") {
    	alert("Bad Country")
    	return false
    	} 
     
    	if(statut==false){
    		alert('2 '+error); //message afficher en 1er
    		return false;
    	}	
     
    	if (document.mail_form.champ4.value == "") {
    	alert("No title")
    	return false
    	} 	
     
    //}
    } // Fin de la fonction
    </script>
     
    </head>
     
    <body>
     
    <form name="mail_form" method="post" action="<?=$_SERVER['PHP_SELF']?>" onsubmit="return GetAdress()">

  2. #2
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    La fonction geo.getLocations est asynchrone, donc ne bloque pas l'exécution de ton code. C'est la raison du comportement observé: tu évalues le statut avant que le retour de la fonction geo.getLocations ait eu lieu. Il faut que tu réorganises ton code pour d'abord appeler GetAdress(), et ensuite lors de la réponse du server faire ou pas un submit de ton formulaire.

    Note au passage que avant de vérifier la localisation tu devrais peut-être vérifier la validité des champs, celle-ci étant d'après ton code invalidante.

    Bon dev,

    ERE

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/04/2014, 16h47
  2. Réponses: 10
    Dernier message: 29/06/2013, 00h46
  3. Bizarrerie avec getXhr() et ordre d'appel des fonctions
    Par LadyArwen dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2011, 11h32
  4. Ordre d'appel des fonctions
    Par ElSegador66 dans le forum Langage
    Réponses: 5
    Dernier message: 26/11/2010, 16h27
  5. Ordre d'appel fonction Javascript
    Par jeannot1974 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/11/2006, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo