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 :

aide sur return


Sujet :

JavaScript

  1. #1
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut aide sur return
    Bonjour à tous,

    Etant plus habitué à python j'apprend js pour utiliser l'api google map.

    Mais je n'arrive pas à faire un "return" et cela fait un moment que je cherche.

    Sauriez vous pourquoi pour le code suivant,
    Dans la fonction adress2latlng j'ai une une valeur pour latlng_local que je n’arrive pas à récupérer dans initialize ?

    Merci de votre aide

    Alex

    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
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript"
        src="http://maps.google.com/maps/api/js?sensor=false">
    </script>
    <script type="text/javascript">
     
     
        function initialize() {
        var latlng_center=adress2latlng("paris,France");
        alert("dans initialize : "+latlng_center)
        }
     
        function adress2latlng(address) {
            var geocoder;
            geocoder = new google.maps.Geocoder();
            geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latlng_local = results[0].geometry.location;
                alert("dans adress2latlng "+address+" latlng "+latlng_local);
                return latlng_local;
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            }
            });
        }
     
     
    </script>
    </head>
    <body onload="initialize()">
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    Bonsoir alexdevl,
    J'ai essayé les closures ,les variables globales ,j'ai même fais une classe
    et tout ce que je récupère c'est le code de la fonction et même le code de la méthode de google
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function (a, b) {
        S(Jd, function (c) {c.geocode(a, b);});
    }
    j'ai même créer une fonction à part
    rien n'y fait et c'est un probleme qui m'interesse une fonction dans une méthode d'objet j'ai eu le même soucis avec Prototype.
    c'est une super closure en gros
    qu'est que results ?
    il y aurait pas dans l'api un getter
    genre
    results.responseXXX??
    Bon courage
    EDIT results est un objet vide qui renvois object object et 0 et encore object object et 0 etc etc

  3. #3
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    salut,
    une solution certes de folie, mais qui fonctionne
    - Extraire les coordonnées via une fonction dans un element caché
    - attendre que la valeur ait changé (synchro)
    ça donne
    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 type="text/javascript">
     
        function initialize() {
    	adress2latlng("paris,France");
    	// synchronisation
    	timer = setInterval ("if (getHiddenValue()) alert('dans initialize : '+getHiddenValue()); setHiddenValue(''); clearInterval(timer);",500)
        }
     
        function adress2latlng(address) {
            var geocoder;
            geocoder = new google.maps.Geocoder();
            geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latlng_local = results[0].geometry.location;
    	    buffer = results[0].geometry.location;
    	    setHiddenValue(buffer);
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            }
            });
        }
     
    	function setHiddenValue(data) {
    		document.getElementById('txt').innerHTML = data;
    		}
    	function getHiddenValue() {
    		if (document.getElementById('txt').innerHTML=='') return false;
    		else return document.getElementById('txt').innerHTML;
    		}
     
     
    </script>
    </head>
    <body onload="initialize()">
      coucou
      <div id="map_canvas" style="width:100%; height:100%"></div>
      <div id="txt"></div>
      titi
    </body>
    </html>
    Mais doit y avoir plus simple !

  4. #4
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    et les variables super globales alors (window[]) !
    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
    <script type="text/javascript">
     window['buffer']='';
     
        function initialize() {
    	adress2latlng("paris,France");
    	// synchronisation
    	timer = setInterval ("if (window['buffer']!='') alert('dans initialize : '+window['buffer']); window['buffer']=''; clearInterval(timer);",500)
        }
     
        function adress2latlng(address) {
            var geocoder;
            geocoder = new google.maps.Geocoder();
            geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latlng_local = results[0].geometry.location;
    	    window['buffer'] = latlng_local;
            } else {
              alert("Geocode was not successful for the following reason: " + status);
            }
            });
        }
     
     
     
    </script>
    </head>
    <body onload="initialize()">
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    Merci ce n'est pas mon topic mais j'apprend quelque chose là
    pour la 1er solution j'y avais pensé et pour les variables super globale j'ignorais leurs existences
    A utiliser avec modération surement mais ça va me rendre service
    En gros c'est un passage de valeur par réference j'ignorais que c'etait possible en Js...

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 070
    Points : 44 677
    Points
    44 677
    Par défaut
    Bonjour, pour répondre à
    Citation Envoyé par alexdevl
    Sauriez vous pourquoi pour le code suivant,
    Dans la fonction adress2latlng j'ai une une valeur pour latlng_local que je n’arrive pas à récupérer dans initialize ?
    il faut bien te rendre compte que la function initialize appelles la fonction adress2latlng qui elle lance la fonction anonyme de ton geocoder, cette action est asynchrone, elle s'exécute mais rend la main, ce qui entraîne un retour dans la fonction initialize sans attendre le retour de cette action.
    en résumé voila ce qui se passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DEBUT function initialize()
    ----DEBUT function adress2latlng(address)
    ----FIN function adress2latlng(address)
    ----latlng_center = undefined
    FIN function initialize()
    DEBUT function (results, status)
    ----address = paris,France, latlng = (48.8566667, 2.3509870999999975)
    la source corrigée pour voir le principe, ne pas ce formaliser sur le code il n'est modifié que dans le but d'afficher la chronologie des appels
    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
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript">
    var decal = -4;
    window.alert = function(txt){
      decal = txt.match('DEBUT') ? decal +4 : decal;
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal +4 : decal;
      document.getElementById('div_info').innerHTML += new Array( decal+1).join('-') +txt +'<br>';
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal -4 : decal;
      decal = txt.match('FIN')   ? decal -4 : decal;
    }
    function initialize(){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var latlng_center = adress2latlng("paris,France");
      alert("latlng_center = " + latlng_center)
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    function adress2latlng(address){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var geocoder;
      geocoder = new google.maps.Geocoder();
      geocoder.geocode({
        'address': address
      }, function (results, status){
        alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
        if (status == google.maps.GeocoderStatus.OK){
          var latlng_local = results[0].geometry.location;
          alert("address = " + address + ", latlng = " + latlng_local);
          return latlng_local;
        }
        else{
          alert("Geocode was not successful for the following reason: " + status);
        }
        alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
      });
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    </script>
    </head>
    <body onload="initialize()">
      <div id="div_info"></div>
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>
    en gros ta valeur est retournée...dans le vide mais pas dans initialize

    Pour l'exploiter il te faut le faire à partir du corps de la fonction anonyme, ou de passer le résultat en paramètre à une fonction.
    Exemple dans le même style que le code ci dessus
    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
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript">
    var decal = -4;
    window.alert = function(txt){
      decal = txt.match('DEBUT') ? decal +4 : decal;
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal +4 : decal;
      document.getElementById('div_info').innerHTML += new Array( decal+1).join('-') +txt +'<br>';
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal -4 : decal;
      decal = txt.match('FIN')   ? decal -4 : decal;
    }
    function centreMap( lat_lng){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      alert("latlng_center = " + lat_lng);
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    function initialize(){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var latlng_center = adress2latlng("paris,France");
      alert("latlng_center = " + latlng_center)
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    function adress2latlng(address){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var geocoder;
      geocoder = new google.maps.Geocoder();
      geocoder.geocode({
        'address': address
      }, function (results, status){
        alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
        if (status == google.maps.GeocoderStatus.OK){
          var latlng_local = results[0].geometry.location;
          centreMap( latlng_local);
        }
        else{
          alert("Geocode was not successful for the following reason: " + status);
        }
        alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
      });
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    </script>
    </head>
    <body onload="initialize()">
      <div id="div_info"></div>
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>
    le résultat sera dans ce cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DEBUT function initialize()
    ----DEBUT function adress2latlng(address)
    ----FIN function adress2latlng(address)
    ----latlng_center = undefined
    FIN function initialize()
    DEBUT function (results, status)
    ----DEBUT function centreMap( lat_lng)
    --------latlng_center = (48.8566667, 2.3509870999999975)
    ----FIN function centreMap( lat_lng)
    FIN function (results, status)
    Citation Envoyé par Billy KiT
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        function initialize() {
    	adress2latlng("paris,France");
    	// synchronisation
    	timer = setInterval ("if (window['buffer']!='') alert('dans initialize : '+window['buffer']); window['buffer']=''; clearInterval(timer);",500)
        }
    ...
    en réalité tu ne te trouves plus dans la fonction initialize, mais cela reste également une solution

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 070
    Points : 44 677
    Points
    44 677
    Par défaut
    Citation Envoyé par moi même
    en réalité tu ne te trouves plus dans la fonction initialize, mais cela reste également une solution
    en fait à la relecture c'est également une autre "mauvaise" solution, autant exploiter le résultat dans la fonction anonyme que de faire un spolling

  8. #8
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    il faut bien te rendre compte que la function initialize appelles la fonction adress2latlng qui elle lance la fonction anonyme de ton geocoder, cette action est asynchrone, elle s'exécute mais rend la main, ce qui entraîne un retour dans la fonction initialize sans attendre le retour de cette action.
    Citation Envoyé par NoSmoking Voir le message
    en fait à la relecture c'est également une autre "mauvaise" solution, autant exploiter le résultat dans la fonction anonyme que de faire un spolling
    Dans ce cas précis, alexdevl souhaite "stocker" un résultat de cette fonction asynchrone pour l'utiliser hors de celle-ci. Alors quelle autre solution que de faire du "spooling".
    L'initialisation peut se faire en 2 étapes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        function initialize() {
    	adress2latlng("paris,France");
    	timer = setInterval ("if (window['buffer']!='') initializeIsReady();",500)
        }
        function initializeIsReady() {
    	alert('dans initialize : '+window['buffer']);
    	window['buffer']='';
    	clearInterval(timer);
        }

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    Voilà une solution sans setInterval et sans super global
    qui utilise un objet vu que qu'au fond le soucis est la méthode de google qui empêche de récupérer la valeur par des closures
    Finalement tout devient synchrone avec cette solution

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript"
        src="http://maps.google.com/maps/api/js?sensor=false">
    </script>
    <script type="text/javascript">
    function Event(){
    this.addListener=function(element,baseName,nameFunction){
     
     
    if(element.addEventListener){
    element.addEventListener(baseName,nameFunction,false);
    }
    else if(element.attachEvent){
    element.attachEvent('on'+baseName,nameFunction);
    }
    else{
     
    //
    }
    }    
    }
     
     
     
     
        function GoogleValue(){
     
    	this.value=0;	
    	if(typeof GoogleValue.init=="undefined"){
    	GoogleValue.prototype.extract=function(res){	
    	this.value=res;	
    	adress2latlng(this.value);// on renvoit à la fonction de depart 
    	}	
    	GoogleValue.prototype.initialize=function(address,objet){     
    	var geocoder;
            geocoder = new google.maps.Geocoder();
    		geocoder.geocode( { 'address': address},function(results,status) {
     
            if (status == google.maps.GeocoderStatus.OK) {
                var latlng_local = results[0].geometry.location;  
    			objet.extract(latlng_local);      //on appelle la méthode extract sur l'objet GoogleValue passé en paramètre   
            }
    		else {
              alert("Geocode was not successful for the following reason: " + status);
    		  }	
    		  });
     
     
     
    	};
    	GoogleValue.init=true;
    	}
     
     
     
     }
    </script>
    </head>
    <body>
    <script>
     
    function  adress2latlng(){
    if(arguments[0].type=="load"){// le 1er argument etant un objet event on créé l'objet uniquement dans ce cas là  
    oGoogle=new GoogleValue();//on créé l'objet 
    oGoogle.initialize("paris,France",oGoogle);//on apelle la méthode initialize et on lui passe l'objet 
    }
    else{ // la fonction cette fois ci est appellé par la méthode d'objet extract le 1er argument est donc la valeur que l'on veut récuperer  et  on stop la récursivité.
     
    latlng_global=arguments[0];
    alert(latlng_global);// et on affiche la valeur voulue 
    return false;
    }
    }
     
    var eventObj=new Event();
    eventObj.addListener(window,'load',adress2latlng);	
     
    </script>
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>
    En tout cas ,c'est un cas trés interressant que l'on rencontre avec tous les api
    Cela dit comme dit nosmoking on peut trés bien utiliser cette valeur dans sa fonction asynchrone et appeler des classes etc en faire une sorte de Main_fonction

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    une autre solution trés simple créer un cookie dans la fonction anonyme actualiser la page une fois et récupérer la valeur.

  11. #11
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 070
    Points : 44 677
    Points
    44 677
    Par défaut
    Citation Envoyé par Billy KiT Voir le message
    Dans ce cas précis, alexdevl souhaite "stocker" un résultat de cette fonction asynchrone pour l'utiliser hors de celle-ci. Alors quelle autre solution que de faire du "spooling".
    j'allais te proposer une solution proche de celle que vient de faire laurentg2003, en plus simple me semble t-il, à savoir rappeler la fonction avec cette fois ci un paramètre à exploiter, si pas d'argument on appels la fonction sinon on exploite l'argument

    la source avec traçage
    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
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0px; padding: 0px }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
    <script type="text/javascript">
    var decal = -4;
    window.alert = function(txt){
      decal = txt.match('DEBUT') ? decal +4 : decal;
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal +4 : decal;
      document.getElementById('div_info').innerHTML += new Array( decal+1).join('-') +txt +'<br>';
      decal = !txt.match('DEBUT')&&!txt.match('FIN') ? decal -4 : decal;
      decal = txt.match('FIN')   ? decal -4 : decal;
    }
    function initialize(param){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      if( !param){
        var latlng_center = adress2latlng("paris,France");
      }
      else{
        alert("latlng_center = " + param);
        // le reste de la fonction
      }
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    function adress2latlng(address){
      alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
      var geocoder;
      geocoder = new google.maps.Geocoder();
      geocoder.geocode({
        'address': address
      }, function (results, status){
        alert("<b>DEBUT<\/b> " +arguments.callee.toString().split('{')[0]);
        if (status == google.maps.GeocoderStatus.OK){
          initialize( results[0].geometry.location);
        }
        else{
          alert("Geocode was not successful for the following reason: " + status);
        }
        alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
      });
      alert("<b>FIN<\/b> " +arguments.callee.toString().split('{')[0]);
    }
    </script>
    </head>
    <body onload="initialize()">
      <div id="div_info"></div>
      <div id="map_canvas" style="width:100%; height:100%"></div>
    </body>
    </html>
    [edit]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DEBUT function initialize(param)
    ----DEBUT function adress2latlng(address)
    ----FIN function adress2latlng(address)
    FIN function initialize(param)
    DEBUT function (results, status)
    ----DEBUT function initialize(param)
    --------latlng_center = (48.8566667, 2.3509870999999975)
    ----FIN function initialize(param)
    FIN function (results, status)
    [/edit]

    Citation Envoyé par laurentg2003
    une autre solution trés simple créer un cookie dans la fonction anonyme actualiser la page une fois et récupérer la valeur.
    c'est moyen par rapport à ton autre solution.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    oui c'est + ou - des solutions similaires
    ensuite ma solution est simple c'est le code orienté objet qui peut sembler la rendre compliqué mais c'est un script que je réutiliserai avec les framework
    Pour etre franc c'est ta solution qui m'a l'air compliqué
    Aprés en programmation et surtout Js chacun a sa propre maniere de programmer et on est plus à l'aise avec sa maniere et c'est toute la richesse de javaScript
    ma derniere solution est juste un manière de dire que cela peut se faire comme ça mais c'etait juste histoire de dire que c'est possible mais pas souhaitable

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 070
    Points : 44 677
    Points
    44 677
    Par défaut
    dans ta solution je remarquais juste que le objet.extract(latlng_local) est en fait adress2latlng(this.value), alors autant mettre directement adress2latlng(latlng_local) dans la fonction, et dans ce cas on fait exactement la même chose, c'est pour cela que je j'ai écris en plus simple me semble t-il.

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    c'est exact mais c'est volontaire car c'est pour pouvoir créer des méthodes utilisant ultérieurement cette valeur , un getter et un setter
    mais la c'est encore plus simple donc
    en mettant le tout en procédural c d'une simplicité totale
    Ensuite on pourrait s'amuser à tester laquelle des 2 est la plus rapide mais la ça depend de bcp de parametre
    En tout cas on a bien travailler
    il faudra que j'etudie ta solution de prés ça peut me donner des idées
    car justement ce n'est pas ma maniere de faire

  15. #15
    Membre régulier Avatar de Billy KiT
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 73
    Points
    73
    Par défaut
    La solution de NoSmoking est surement la plus simple rendant l'ensemble séquentiel, ceci dit (brahim), d'accord avec laurentg2003 sur le fait que la fonction adress2latlng ne pourra plus être utiliser ailleurs puisqu'elle déclenche systématiquement initialize.
    Bon tout cela dépend évidemment du but recherché, et il y a toujours des solutions pour parer à cela.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    justement moi je ne veux pas rendre ça séquentielle
    dans extract je vais mettre d'autres méthodes avec des signatures differentes via les closures dont le nom sera en parametre dans extract c une maniere de surcharger une méthode et d'avoir un code pourri plein de fuite de mémoires

  17. #17
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 070
    Points : 44 677
    Points
    44 677
    Par défaut
    Citation Envoyé par Billy KiT Voir le message
    La solution de NoSmoking est surement la plus simple rendant l'ensemble séquentiel, ceci dit (brahim), d'accord avec laurentg2003 sur le fait que la fonction adress2latlng ne pourra plus être utiliser ailleurs puisqu'elle déclenche systématiquement initialize.
    Bon tout cela dépend évidemment du but recherché, et il y a toujours des solutions pour parer à cela.
    on peut toujours récupérer la fonction appelante et l'exécuter en sortie en utilisant le caller de la fonction
    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
    function adress2latlng(address){
      // recup fonction appelante
      var fctAppelante = adress2latlng.caller;
      var geocoder;
      geocoder = new google.maps.Geocoder();
      geocoder.geocode({
        'address': address
      }, function (results, status){
        if (status == google.maps.GeocoderStatus.OK){
          // execution fonction appelante
          fctAppelante( results[0].geometry.location);
        }
        else{
          alert("Geocode was not successful for the following reason: " + status);
        }
      });
    }

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Points : 204
    Points
    204
    Par défaut
    c'est ce que nos codes font mais moins directement je pense
    Mais c'est intéressant merci

  19. #19
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut Merci !
    He bien moi qui croyais avoir un problème de syntaxe !

    Si je comprend bien le problème central pour moi est celui-ci :
    cette action est asynchrone, elle s'exécute mais rend la main, ce qui entraîne un retour dans la fonction initialize sans attendre le retour de cette action.
    .

    C'est qu'utiliser une fonction comme celle-ci sur le net demande forcément un temps de traitement
    D'autre part j'avais l'affichage de intitialize avant adress2latlng et je comprend pourquoi.

    Je voudrais traiter 300 points, je ne pourrais attendre le traitement de ces 300 points.
    Je dois donc faire les geocodes avant et utiliser les valeur latlng dans mon script en utilisant néanmoins vos codes

    Merci de votre aide à tous !

    Alex

  20. #20
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 070
    Points : 44 677
    Points
    44 677
    Par défaut
    Je voudrais traiter 300 points, je ne pourrais attendre le traitement de ces 300 points.
    Je dois donc faire les geocodes avant et utiliser les valeur latlng dans mon script en utilisant néanmoins vos codes
    effectivement avec 300 points à traiter autant, si ceux ci sont connus, les calculer avant et les mettre en fichier XML ou autre tableau d'objet, exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var tMarker = [
      { lat :45.767299,
        lon : 4.834329,
        adresse  : 'Lyon'
      },
    etc...
    il suffit ensuite de les traiter en boucle.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. demande d'aide sur samba
    Par marcoss dans le forum Développement
    Réponses: 5
    Dernier message: 04/12/2003, 19h38
  2. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19
  3. Réponses: 2
    Dernier message: 27/02/2003, 01h33
  4. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54
  5. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

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