Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/03/2011, 18h48   #1
Membre confirmé
 
Inscription : avril 2007
Messages : 204
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : avril 2007
Messages : 204
Points : 228
Points : 228
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 :
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>
alexdevl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2011, 23h34   #2
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à laurentg2003
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 :
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
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 00h19   #3
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
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 :
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 !
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 00h42   #4
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
et les variables super globales alors (window[]) !
Code :
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>
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 10h35   #5
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à laurentg2003
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...
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 11h51   #6
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
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 :
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 :
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 :
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 :
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 :
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
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 12h05   #7
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
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
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 13h51   #8
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
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 :
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);
    }
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 14h16   #9
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à laurentg2003
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 :
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
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 14h22   #10
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à 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.
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 15h36   #11
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
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 :
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 :
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.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 15h50   #12
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à laurentg2003
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
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 16h01   #13
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
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.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 16h10   #14
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à laurentg2003
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
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 16h29   #15
Membre du Club
 
Avatar de Billy KiT
 
Inscription : mars 2011
Messages : 47
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 47
Points : 59
Points : 59
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.
Billy KiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 16h39   #16
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à laurentg2003
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
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 16h44   #17
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
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 :
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);
    }
  });
}
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 17h27   #18
Membre habitué
 
Inscription : janvier 2007
Messages : 225
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2007
Messages : 225
Points : 115
Points : 115
Envoyer un message via MSN à laurentg2003
c'est ce que nos codes font mais moins directement je pense
Mais c'est intéressant merci
__________________
"Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." (Albert Einstein / 1879-1955)
laurentg2003 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 19h00   #19
Membre confirmé
 
Inscription : avril 2007
Messages : 204
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : avril 2007
Messages : 204
Points : 228
Points : 228
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 :
Citation:
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
alexdevl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 21h06   #20
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 933
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 933
Points : 4 757
Points : 4 757
Citation:
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 :
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.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h11.


 
 
 
 
Partenaires

Hébergement Web