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 :

Problème avec return


Sujet :

JavaScript

  1. #1
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut Problème avec return
    Salut,

    J'ai fait une fonction permettant de lire le contenu d'un fichier du serveur (j'ai trouvé l'astuce pour ne pas avoir à se soucier de la mise en cache des fichiers avec explorer (no=no+1) ). Normalement cette fonction devrait retourner la chaine de caractères correspondant au contenu du fichier, mais c'est pas le cas. Pourtant le alert(Chaine) m'affiche le bon contenu. Je suis perplexe !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var no=0;
    function Lire(Fichier){
      no=no+1;
      requete=new ActiveXObject("Microsoft.XMLHTTP");
      requete.open("get",'lire.php?chaine='+no+'&fichier='+Fichier,true);
      requete.onreadystatechange = function() {
        if(requete.readyState==4){
          Chaine = requete.responseText;
          alert(Chaine);
          return Chaine;}}
      requete.send(null);}
    ...
    ...
    membres=Lire("membres.rdf");//Affiche membres="undefined"
    Fichier lire.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    header('Content-type: text/html; charset=iso-8859-1');
    $fichier=$_GET["fichier"];
    $fic=fopen($fichier,"r");
    $chaine=fgets($fic);
    fclose($fic);
    $i=0;
    foreach($_GET as $v){ 
            $i=$i+1;
            if ($i==1) echo $chaine;}
    ?>
    Merci d'avance.
    Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    la question est: qu'attends-tu de ce return ?

  3. #3
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    Dans la première fenetre de code, 'membres' devrait contenir le contenu du fichier, mais ce n'est pas le cas... Return ne semble pas faire son rôle.
    Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    ah ok j'avais pas lu jusqu'au bout;

    bref, je te conseille de placer la dernière ligne en fin de fonction onreadystatechange;

    visiblement, membres est définie hors fonction...

  5. #5
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    En fait cette ligne est dans une autre fonction que je n'ai pas ici recopiée. Donc tu me dis de déclarer 'membre' comme variable publique. C'est une solution, certes, mais ça m'arrange qu'à moitié. Enfin, merci tout de même.
    Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    hum, j'ai encore lu trop vite, décidément...

    tu peux essayer de faire ton return après la condition readyState?

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    et même tout bonnement en fin de Lire;
    bref, pour l'instant, Lire ne renvoie rien! même si la fonction incluse renvoie Chaine;

  8. #8
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    Euh, il doit y avoir une histoire de temps d'attente nécessaire, j'ai écrit ceci. Résultat alert marque "undefined", mais return joue son rôle. Si j'enlève le alert, ça marche plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function Lire(Fichier)
    { no=no+1;
       var Chaine;
       var requete=new ActiveXObject("Microsoft.XMLHTTP");
       requete.open("get",'lire.php?chaine='+no+'&fichier='+Fichier,true);
       requete.onreadystatechange = function() {
          if(requete.readyState==4){
             Chaine = requete.responseText;}}
       requete.send(null);
       alert(Chaine);
       return Chaine;}
    Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...

  9. #9
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    oui, c'est logique, l'appel serveur n'est pas effectué dès la lecture de la fonction par js, puisque le propre de readystatechange est la temporisation;


    essaie:

    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
    var no=0; 
    function Lire(Fichier){ 
      no=no+1; 
      requete=new ActiveXObject("Microsoft.XMLHTTP"); 
      requete.open("get",'lire.php?chaine='+no+'&fichier='+Fichier,true); 
      requete.onreadystatechange = function nom_fonction() { 
        if(requete.readyState==4){ 
          Chaine = requete.responseText;
          return Chaine;
        }
      }
    requete.send(null);
    return nom_fonction();
    } 
    membres=Lire("membres.rdf");

  10. #10
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par javatwister
    essaie:

    return nom_fonction();
    Ca marche ça????? Je serais bien intéressé/étonné si c'était le cas. La fonction est retournée en référence ou en copie du contenu? Tu pense que JS va comprendre qu'il doit retourner le return de cette fonction????? Ce serait étonnant

    Résultat alert marque "undefined", mais return joue son rôle
    Normal, au moment de l'alert, le résultat n'est pas encore revenu, mais au moment du return oui... Ceci dit, ce n'est pas du tout la bonne façon de faire avec XHR (=xmlHttpRequest). XHR est un objet asynchrone. Tu lui dis de faire la requete, mais tu ne sais pas du tout quand elle reviendra. Donc la seule façon d'utiliser cette objet est de faire une fonction qui n'a pas de retour, qui envoie la requete, et une autre fonction, qui au retour de la requete (onreadystatchange) effectue tous les traitement nécessaires....

    Tu peux nous montrer un peu plus du JS que tu cherche à faire?

    A quoi te sert ta variable membres. Il faut que tu repenses ta façon de faire, car Lire ne peut (a mon avis) renvoyer de résultat.

  11. #11
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Citation Envoyé par denisC
    Citation Envoyé par javatwister
    essaie:

    return nom_fonction();
    Ca marche ça?????
    oui, bien sûr que ça marche!

    par contre, il me semble que requete.onreadystatechange attend uniquement une fonction littérale, donc là, ça peut bugger;

  12. #12
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    Décidement je sais pas si ça va marcher un jour...Voici le code complet. C'est dans le but de faire un jeu de dames web multijoueurs avec gestion des membres. Pour l'instant seule l'inscription sans mot de passe est sensée marcher. Mais seule la fonction 'Ecrire' marche.

    dames.php :
    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
    <html>
    <head>
    	<META HTTP-EQUIV="pragma" CONTENT="no-cache"> 
    	<title>Echec</title>
    	<link href="../../style_fond.css" rel="stylesheet" type="text/css">	
    	<script language="javascript">
     
    	//Variables publiques
    	var no=0;	              //Sert pour anihiler la cache
    	var transfert="Z";     //0 : lecture possible, 1 : lecture impossible
    	var nom="Z";          //Votre nom de membre
    	var pass="Z";          //Votre mot de passe
    	var adversaire="Z";  //Nom de votre adversaire
    	var you="Z";           //1 : joueur1, 2 : joueur2
    	var aqui="Z";          //1 : à joueur1, 2 : à joueur2
    	var carte="Z";         //Position des pièces lue
    	var old_carte="Z";   //Position dernière des pièces
     
    	function Lire(Fichier)
    	{	no=no+1;
    		var Chaine;
    		var requete=new ActiveXObject("Microsoft.XMLHTTP");
    		requete.open("get",'lire.php?chaine='+no+'&fichier='+Fichier,true);
    		requete.onreadystatechange = function attente() {
    			if(requete.readyState==4)
    			{	Chaine = requete.responseText;
    				return Chaine;}}
    		requete.send(null);
    		alert("L:"+Chaine);
    		return attente();
    		//
    		}
     
    	function Ecrire(Fichier,Chaine)
    	{	var requete=new ActiveXObject("Microsoft.XMLHTTP");
    		requete.open('get','ecrire.php?chaine='+Chaine+'&fichier='+Fichier,false); 
    		requete.send(null);}
     
    	function saisie_inscription(){
    		var membres,moi,user,liste,bon;
    		do{ //si transfert = 1, quelqu'un utilise les fichiers, donc attente
    			transfert=Lire("transfert.rdf");}
    		while(transfert=="1");
    		Ecrire("transfert.rdf","1"); //Mise en attente pour les autres
    		membres=Lire("membres.rdf"); //Liste des membres
    		alert("S:"+membres);
    		moi=document.getElementById["t_inscription_nom"].value;
    		alert("M:"+moi);
    		liste=membres.split(">");
    		bon="oui";
    		for(user=0;user<6;user=user+1)	//Pseudo s'inscrit si n'existe pas déjà
    		{	if(liste[user]==moi)
    			{	alert("Désolé : ce pseudo existe déjà");
    				bon="non";}}
    		if (bon=="oui") 
    		{	Ecrire("membres.rdf",membres+">"+moi);
    			alert("Nouveau pseudo enregistré");}
    		Ecrire("transfert.rdf","0");	//Liberer acces aux données
    	}
     
    	</script>
    </head>
     
    <body>
    <p><u>Deja membre : </u></p>
    <p>
      <input name="t_connexion_non" type="text" id="t_connexion_non">
      <input name="t_connexion_pass" type="password" id="t_connexion_pass">
      <input name="b_connection" type="submit" id="b_connection" value="Connection">
    </p>
    <p>&nbsp;</p>
    <p><u>Nouveau, inscription : </u></p>
    <p>
      <input name="t_inscription_nom" type="text" id="t_inscription_nom">
      <input name="t_inscription_pass" type="password" id="t_inscription_pass">
      <input name="b_inscription" type="submit" id="b_inscription" value="Inscription" onClick="saisie_inscription()">
    </p>
    </body>
     
    </html>
    Lire.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    header('Content-type: text/html; charset=iso-8859-1');
    $fichier=$_GET["fichier"];
    $fic=fopen($fichier,"r");
    $chaine=fgets($fic);
    fclose($fic);
    $i=0;
    foreach($_GET as $v){ 
            $i=$i+1;
            if ($i==1) echo $chaine;}
    ?>
    Ecrire.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $chaine=$_GET["chaine"];
    $fichier=$_GET["fichier"];
    $fic=fopen($fichier,"w");
    fwrite($fic,$chaine);
    fclose($fic);
    ?>
    Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...

  13. #13
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    C'est dans le but de faire un jeu de dames
    ouais, j'avais jeté un oeil sur le forum php

    bon, ça fait des bases solides pour bosser tout ça!

    en attendant, c'est qd même bizarre que tu utilises 2 fois chaine comme nom de variable, pour appeler Lire.php

  14. #14
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    comme disait denis, passe-toi de return et récupère la requête dans la fonction d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function Lire(Fichier) 
       {   no=no+1; 
          var Chaine; 
          var requete=new ActiveXObject("Microsoft.XMLHTTP"); 
          requete.open("get",'lire.php?chaine='+no+'&fichier='+Fichier,true); 
          requete.onreadystatechange = function() { 
             if(requete.readyState==4) 
             {   Chaine = requete.responseText;traitement(chaine);}
           } 
          requete.send(null); 
          }
    bref, membre semble superflue;


    à part ça, pourquoi ces "mises en attente"?
    php sait gérer tout seul une file d'attente en lecture et en écriture non?

  15. #15
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    J'ai trouvé la solution ! Dans la fonction lire, avec open il faut remplacer true par false...Ca donne donc ceci :

    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
    	function Lire(Fichier)
    	{	no=no+1;
    		var x,y;
    		var Chaine;
    		var requete=new ActiveXObject("Microsoft.XMLHTTP");
    		requete.open("get",'lire.php?chaine='+no+'&fichier='+Fichier,false);
    		requete.onreadystatechange = function attente() {
    			if(requete.readyState==4)
    			{	Chaine = requete.responseText;
    				return Chaine;}}
    		requete.send(null);
    		return attente();
    		}
     
     
    	function saisie_inscription(){
    		var membres,moi,user,liste,bon;
    		membres=Lire("membres.rdf"); //Liste des membres
    		moi=document.acces.t_inscription_nom.value;
    		//alert("S:"+membres);
    		//alert("M:"+moi);
    		liste=membres.split(">");
    		bon="oui";
    		for(user=0;user<6;user=user+1)	//Pseudo s'inscrit si n'existe pas déjà
    		{	if(liste[user]==moi)
    			{	alert("Désolé : ce pseudo existe déjà");
    				bon="non";}}
    		if (bon=="oui") 
    		{	Ecrire("membres.rdf",membres+">"+moi);
    			alert("Nouveau pseudo enregistré");}
    	}

    php sait gérer tout seul une file d'attente en lecture et en écriture non?
    Ben j'en étais pas sur, je débute un peu.

    En tout cas merci beaucoup pour votre aide. Maintenant j'éspère que ça continuera à marcher
    Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...

  16. #16
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par Rémiz
    J'ai trouvé la solution ! Dans la fonction lire, avec open il faut remplacer true par false..
    Du XHR en mode synchrone, beurk!!!

  17. #17
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    Salut,

    Je comprend pas trop pourquoi tu dis ça. Cela risque t il de créer des bugs ? Si c'est que c'est un peu plus long, c'est pas trop grave. En tout cas pour l'instant c'est seul truc que j'ai trouvé et qui marche.
    Celui qui pose une question est bête 5 minutes, celui qui ne la pose pas est bête toute sa vie...

Discussions similaires

  1. [SQUID] Problème avec "Return Direct"
    Par FranT dans le forum Réseau
    Réponses: 1
    Dernier message: 25/05/2011, 15h48
  2. Problème avec un return
    Par NFHnv dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 12/05/2009, 17h46
  3. Problème avec return
    Par sydius dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/07/2008, 11h35
  4. Problème de return avec l'OO
    Par Jasmine80 dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2007, 16h25
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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