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

JavaScript Discussion :

petite question bete sur : La portée des variables


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut petite question bete sur : La portée des variables
    Bonjour ,
    Je n'est décidement rien compris a ce language... Donc le probleme , j'essaye d'assigner des valeurs a des variables globales , mais ca ne marche que dans ma function locale ! impossible aussi de faire un return.... voici le code :
    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
    41
    42
     
    function searchAddress(id)
    	{
    		var tlatlng1, tlatlng2;
     
    		geocoder1.geocode(
    		{
    			address: clients[id].adresseDepart
    		}, 
    		function(results, status)
    		{
    			if (status == google.maps.GeocoderStatus.OK)
    			{
    				// clients[id].latlngDepart = results[0].geometry.location ;
    				tlatlng1 = results[0].geometry.location;
    				alert(tlatlng1);// ok !
    			} 
    			else 
    			{
    				alert('Le géocodage 1 a échoué.');
    			}
    		});
    		geocoder2.geocode(
    		{
    			address: clients[id].adresseArrivee
    		}, 
    		function(results, status)
    		{
    			if (status == google.maps.GeocoderStatus.OK)
    			{
    				// clients[id].latlngArrivee = results[0].geometry.location ;		
    				tlatlng2 = results[0].geometry.location;	
    				alert(tlatlng2);// ok !
    			} 
    			else 
    			{
    				alert('Le géocodage 2 a échoué.');
    			}
    		});
    		alert(tlatlng1);//undefined
    		return { coordonneesDepart : tlatlng1, coordonneesArrivee : tlatlng2};
    	}
    Si vous pouviez m'expliquer.. par ce que la je comprend plus (surement une notion toute bete que je n'ai pas compris... ) Merci à vous !

    PS: le double geocodage n'est pas très propre.. y a t'il moyen de "multi-geocoder"?

  2. #2
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    En gros, ton assignations de tlatlng1 se passe après ton alert en fin de la fonction searchAddress, donc quand l'alert se produit, tlatlng1 n'a pas encore de valeur.

    Pour simplifier ton code, vois-le comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function searchAddress(){
    	var tlatlng1; // déclaration de ta variable
    	geocoder1.geocode( // appel à geocode
    		function_anonyme // on passe une fonction anonyme en paramètre qui sera appelé plus tard, probablement lors de la réception d'une requête ajax
    	);
    	// fin de l'appel à geocoder, il est très probable que la function anonyme n'ait pas encore été appelée
    	// affiche la variable qui n'a pas encore changé
    	alert(tlatlng1)
    }
    ---

    en fait tu dois concevoir ton traitement différemment lors de l'utilisation d'appels ajax et donc de callback :


    au lieu de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var retour = mon_appel_ajax(); // ici geocoder1.geocode via searchAddress
    traitement(retour);
    //suite...
    tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mon_appel_ajax(params,function callaback(results, status){ // fonction de callback (anonyme dans ton cas) servant à traiter le retour de l'appel ajax
    	if(status){
    		traitement(results);
    		// suite...
    	}
    });

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Merci de ton aide !
    Donc si je comprend bien , a la fin de la fonction searchAddress() , je fais un return bidule , et quand j'appel ma fonction je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    searchAddress(id , function callback(bidule))
    {
    function(id)//function anonyme de base sans assignation des valeurs....
    {
    ...
    return bidule ;
    }
    function callback(bidule)
    {
    // et la j'assigne mes valeurs a mon obj client qui se situe dans mon tab clients !?
    }
    }

  4. #4
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    En fait ta fonction searchAdress ne doit (probablement, sauf cas particuliers) rien retourner. Ton traitement ne continue PAS après son retour car tu n'auras pas encore les informations voulues à ce moment là, mais plus tard, lors de la réponse du serveur de google et du déclenchement de ta fonction de callback qui devra inclure le traitement des informations :

    je supprime un de tes 2 geocode pour simplifier l'exemple :

    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
    function searchAddress(id)
    {
    	var  tlatlng2;
    	geocoder2.geocode(
    		// objet comportant les paramètres de ta requête
    		{
    			address: clients[id].adresseArrivee
    		}, 
    		// function anonyme de callback qui sera executé après ta requête
    		function(results, status)
    		{
    			if (status == google.maps.GeocoderStatus.OK)
    			{
    				tlatlng2 = results[0].geometry.location;	
    				// traitement de tlatlng2 
    				// et autre opérations que tu comptais effectuer sur ta valeur de retour de searchAddress
    			} 
    			else 
    			{
    				alert('Le géocodage 2 a échoué.');
    			}
    		}
    	);
    	// pas de return ! le traitement se fera dans le callback en tant voulu
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut D'accord !
    c'est ce que j'avais fais au debut mdr ! j'avais d'ailleurs laissé le code en commentaire ! Donc l'atribut latlngDepart de mon obj client prend bien la valeur results[0].geometry.location de gmap , mais pas immediatement si j'ai bien compris ?
    par contre je pense que du coup , je dois utiliser une fonction de callback a un autre endroit ....
    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
     
    function showMarkers(id)
    {
    			if (clients[id].latlngDepart == 'inconnu' || clients[id].latlngArrivee == 'inconnu')
    			{
    				searchAddress(id);
    			}
    // A partir de la ma function ne marchera plus si j'ai bien
    //compris puisque clients[id].latlngDepart vaudra encore 'inconnu' , non ?
    // comment indiquer a ma function quand  clients[id].latlngDepart a une 
    //nouvelle valeur ? une boucle serai trop gourmande en ressource nan ?:aie: 
     
    			/([0-9]+\.[0-9]+).+([0-9]+\.[0-9]+)/.exec(clients[id].latlngDepart);
    			if(RegExp.$1 != false && RegExp.$2 != false)
    			{
    				 var icone = new google.maps.MarkerImage('../img/Rendez-vous.png',
    								 new google.maps.Size(32, 32), new google.maps.Point(0, 0),
    								 new google.maps.Point(16, 32));
    					 var marker = new google.maps.Marker({ position: new google.maps.LatLng(RegExp.$1 , RegExp.$2),icon: icone,map: map})	;
     
    					 map.panTo(marker.position);
    					 map.setZoom(8);
    			}
    			else
    			{
    				alert('Erreur(s) lors de la geolocalisation.');
    			}

  6. #6
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    function gestionClient(id)
    {
    	/([0-9]+\.[0-9]+).+([0-9]+\.[0-9]+)/.exec(clients[id].latlngDepart);
    	if(RegExp.$1 != false && RegExp.$2 != false)
    	{
    		 var icone = new google.maps.MarkerImage('../img/Rendez-vous.png',
    						 new google.maps.Size(32, 32), new google.maps.Point(0, 0),
    						 new google.maps.Point(16, 32));
    			 var marker = new google.maps.Marker({ position: new google.maps.LatLng(RegExp.$1 , RegExp.$2),icon: icone,map: map})	;
     
    			 map.panTo(marker.position);
    			 map.setZoom(8);
    	}
    	else
    	{
    		alert('Erreur(s) lors de la geolocalisation.');
    	}
    }
    function searchAddress(id)
    {
    	geocoder1.geocode(
    		// objet comportant les paramètres de ta requête
    		{
    			address: clients[id].adresseDepart
    		}, 
    		// function anonyme de callback qui sera executé après ta requête
    		function(results, status)
    		{
    			if (status == google.maps.GeocoderStatus.OK)
    			{
    				// une fois la réponse récupérée, on l'assigne dans le tableau client correspondant
    				clients[id].latlngDepart = results[0].geometry.location;	
    				// puis on traite notre client
    				gestionClient(id);
    			} 
    			else 
    			{
    				alert('Le géocodage 2 a échoué.');
    			}
    		}
    	);
    	/*geocoder2.geocode(
    		// objet comportant les paramètres de ta requête
    		{
    			address: clients[id].adresseArrivee
    		}, 
    		// function anonyme de callback qui sera executé après ta requête
    		function(results, status)
    		{
    			if (status == google.maps.GeocoderStatus.OK)
    			{
    				// une fois la réponse récupérée, on l'assigne dans le tableau client correspondant
    				clients[id].latlngArrivee = results[0].geometry.location;	
    				// puis on traite notre client
    				gestionClient(id);
    			} 
    			else 
    			{
    				alert('Le géocodage 2 a échoué.');
    			}
    		}
    	);*/
     
    	// pas de return ! le traitement se fera dans le callback en tant voulu
    }
    function showMarkers(id)
    {
    	if (clients[id].latlngDepart == 'inconnu' || clients[id].latlngArrivee == 'inconnu')
    	{
    		searchAddress(id);
    	}
    }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Merci !
    J'ai pas encore tester le code , mais en tous cas merci de ton aide , ça m'a aidé a comprendre comment cela fonctionner !

Discussions similaires

  1. [Unity 5] Question sur la portée des variables entre scènes
    Par eliniel dans le forum Unity
    Réponses: 6
    Dernier message: 16/05/2015, 10h01
  2. Précision sur la portée des variables en Java
    Par romit dans le forum Langage
    Réponses: 5
    Dernier message: 19/02/2013, 22h56
  3. Une question sur le stockage des variables
    Par UnReveDeCryptomeria dans le forum C
    Réponses: 10
    Dernier message: 08/06/2006, 23h37
  4. Réponses: 4
    Dernier message: 04/06/2006, 16h53
  5. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 17h18

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