Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2975 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [Résolu] Problème de return d'une fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Problème de return d'une fonction

n°1573319
kmeleon1
Ubuntu Forweeeeever
Posté le 11-06-2007 à 16:25:55  profilanswer
 

Salut à tous !
 
Voilà je développe un petit javascript avec du AJAX, et j'ai un problème au niveau du return d'une fonction:
Pour faire court:

Code :
  1. function xxx()
  2. {
  3. ...
  4. if (xhr.readyState == 4 && xhr.status == 200)
  5. {
  6. str = xhr.responseText;
  7. alert(str);
  8.         if (srt == '1')
  9.         {
  10.                   alerte("Etape 1" );
  11.                   return 1;
  12.         }
  13. }
  14. ...
  15. }
  16. function yyy()
  17. {
  18. if (xxx() == 1)
  19. {
  20.        alert("Ca marche !" );
  21. }
  22. }


Le "Etape 1" s'affiche (donc normalement il devrait retourner 1), seulement le "Ca marche ne s'affiche pas".
Que se passe-t-il (je suis débutant :) ) ?
 
Bonne journée
Kmeleon


Message édité par kmeleon1 le 12-06-2007 à 17:06:18
mood
Publicité
Posté le 11-06-2007 à 16:25:55  profilanswer
 

n°1573345
xtof_83
Freeride Spirit
Posté le 11-06-2007 à 16:51:34  profilanswer
 

Code :
  1. alerte("Etape 1" );

 

ça risque pas de marcher, :D


Message édité par xtof_83 le 11-06-2007 à 16:52:03
n°1573357
kmeleon1
Ubuntu Forweeeeever
Posté le 11-06-2007 à 17:03:59  profilanswer
 

Oui bon hein ^^ De toute façon là n'est pas le problème :P
J'ai trouvé le problème, apparement c'est la portée des variables. En fait le

Code :
  1. if (xhr.readyState == 4 && xhr.status == 200)

se trouve dans une fonction appelée en cas de changement de statut de ma requete AJAX.
Donc le return doit d'abord être interpreté dans la fonction xxx(), puis transmis à yyy().
 
Jvais voir tout ça -_-

n°1573385
kmeleon1
Ubuntu Forweeeeever
Posté le 11-06-2007 à 17:45:00  profilanswer
 

/!\ Pas résolu /!\
 
Ok donc mon problème vient de là:

Code :
  1. function checkAccount() {
  2. getXhr();
  3. alert(doigt_id);
  4. xhr.onreadystatechange = function(formulaire,doigt_id)
  5. {
  6.         if (xhr.readyState == 4 && xhr.status == 200)
  7.  {
  8.   str = xhr.responseText;
  9.   alert(str);
  10.   if (str == '1')
  11.   {
  12.    alert("Ce nom d'utilisateur existe déjà, merci d'en choisi un autre." );
  13.   }
  14.   else if (str == '2')
  15.   {
  16.    alert("Cet alias est déjà utilisé par une autre personne. Soyez créatif(ve) !" );
  17.   }
  18.   else
  19.   {
  20.    test = "salut";
  21.    //accountReq(formulaire,doigt_id);
  22.   }
  23.     }
  24. }
  25. xhr.open("POST", 'check_account.php', true);
  26. xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  27.     xhr.send("member_name="+member_name+"&alias_name="+alias_name+"&var=1" );
  28. alert(test); //"Test undefined"
  29. }


 
La variable test que je déclare dans ma fonction function() pour le onreadystatechange, est pourtant bien déclarée comme une variable globale (il me semble... non ?)
 
Ah lala, le PHP c'est tellement plus simple...


Message édité par kmeleon1 le 11-06-2007 à 18:01:03
n°1573459
kmeleon1
Ubuntu Forweeeeever
Posté le 11-06-2007 à 21:03:34  profilanswer
 

up

n°1573540
leneufjuil​let2006
♫ Adagio ♫
Posté le 12-06-2007 à 08:15:52  profilanswer
 

test est pas un mot réservé en javascript ?
 
Il me semblait avoir lu ça quelque part sur ce forum ???


Message édité par leneufjuillet2006 le 12-06-2007 à 08:16:06
n°1573543
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-06-2007 à 08:50:38  profilanswer
 

même s'il est toléré, ta variable test à une portée locale à ton handler onreadystatechange de l'objet xhr ( qui doit lui être déclaré dans le  namespace global je suppose... ça sent bon le paté.).

 

Donc déclare ta variable test dans checkAccount plutot que dans le handler:

Code :
  1. function checkAccount() {
  2. var test;
  3. ...
  4. }


Message édité par anapajari le 12-06-2007 à 08:51:49
n°1573710
bignose
Posté le 12-06-2007 à 13:03:49  profilanswer
 

Non.  En javascript toute variable non déclarée dans une fonction via   le mot clé "var"  est d'office globale,  indépendement de la fonction où elle est utilisée.  Ici test est globale  (et str et xhr doivent l'ètre aussi, sinon ça marchera pas bien...).

n°1573711
bignose
Posté le 12-06-2007 à 13:09:30  profilanswer
 

Si je comprends bien le problème est que test est undefined quand tu l'affiches ?  Ca ne me semble pas anormal vu les tests que tu fais...  Ou alors j'ai pas compris.

n°1573712
bignose
Posté le 12-06-2007 à 13:09:48  profilanswer
 

Button back attacks again ::  sorry


Message édité par bignose le 12-06-2007 à 13:10:35
mood
Publicité
Posté le 12-06-2007 à 13:09:48  profilanswer
 

n°1573724
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-06-2007 à 13:45:15  profilanswer
 

bignose a écrit :

Non.  En javascript toute variable non déclarée dans une fonction via   le mot clé "var"  est d'office globale,  indépendement de la fonction où elle est utilisée.  Ici test est globale  (et str et xhr doivent l'ètre aussi, sinon ça marchera pas bien...).


O'RLY???
Sauf que là, son appel via xhr est asynchrone et le alert(test) a lieu avant que le onreadystatechange ait lieu.
Test est donc pas encore déclaré dans le scope global au moment du alert [:spamafote]

n°1573870
kmeleon1
Ubuntu Forweeeeever
Posté le 12-06-2007 à 16:18:11  profilanswer
 

Bon, le truc marrant, c'est que je capte rien à ce que vous dites.
 
Reprenons avec ma fonction:
 

Code :
  1. function checkAccount(member_name,alias_name,doigt_id,doigt_reaction) {
  2. getXhr();
  3. alert(doigt_id);
  4.         // Si je met var doigt_id = doigt_id; le alert dans la fonction qui vient juste après renvoie quand même Undefined
  5. xhr.onreadystatechange = function(member_name,alias_name,doigt_id)
  6. {
  7. alert(doigt_id); // Undefined
  8.         if (xhr.readyState == 4 && xhr.status == 200)
  9.  {
  10.   str = xhr.responseText;
  11.   alert(str);
  12.   if (str == '1')
  13.   {
  14.    alert("Ce nom d'utilisateur existe déjà, merci d'en choisi un autre." );
  15.   }
  16.   else if (str == '2')
  17.   {
  18.    alert("Cet alias est déjà utilisé par une autre personne. Soyez créatif(ve) !" );
  19.   }
  20.   else
  21.   {
  22.                                 alert(doigt_id); // Undefined, et j'en ai absolument besoin pour ma fonction...
  23.    /*accountReq(formulaire,doigt_id); <= fonction qui exécute une requête AJAX*/
  24.   }
  25.     }
  26. }
  27. xhr.open("POST", 'check_account.php', true);
  28. xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  29.     xhr.send("member_name="+member_name+"&alias_name="+alias_name+"&var=1" );
  30. }


 
J'ai vraiment du mal avec toutes ces définitions (handler, scope, ce que ça change au niveau de ma variable si le mode est asynchrone ou pas, etc...), si quelqu'un pouvait m'expliquer en 2-3 lignes (et si possible sans me renvoyer vers des liens qui dont pas vraiment ciblés sur mon cas) ça serait super :)
 
Ensuite, un truc que je comprends pas, si une variable est définie par le mot clé "var", il parait qu'elle est donc accessible partout dans n'importe quelle fonction, or si je crée une fonction X() dans laquelle je défini la variable "abc" avec "var abc = "coucou";", ma fonction checkAccount ci-dessus me renverra un Undefined si je lui demande de me l'afficher...
 
 :??:

n°1573917
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-06-2007 à 16:58:21  profilanswer
 

grosso modo comment marche un xhr ( xmlHttpRequest).
Il "appelle" le serveur et quand le serveur lui réponds la fonction définie dans le onreadystatechange est executée.
Le temps entre l'appel et l'execution de la fonction peut varier, mais il n'est "jamais" instantané.

 

Par défaut, le xhr est "asynchrone" c'est à dire que le traitement n'est pas "bloquant" pour le reste.
Dans ton cas, test n'est déclaré que dans la fonction "onreadystatechange" avant cela cette variable n'a aucune valeur.
Tu fais ton appel serveur et tout de suite après tu fais ton alert de ta valeur test.

 

Le retour du serveur n'ayant pas encore eu lieu, la fonction dans le onreadystate n'a pas été éxécutée  et la variable test n'est pas encore définie. Bilan: tu as le droit à une belle erreur.

 


Message édité par anapajari le 12-06-2007 à 17:00:03
n°1573929
kmeleon1
Ubuntu Forweeeeever
Posté le 12-06-2007 à 17:05:40  profilanswer
 

Merci pour les précisions anapajari :)
 
En fait, je déclarai mes variables dans une fonction (elle étaient donc locales), et j'apellais une fonction (dans cette fonction) en transmettant les variables en paramètres. En gros il suffisait que je déclare toutes mes variables en début de script (pour qu'elles soient globales) et que je les récupères dans les fonctions, sans besoin d'indiquer de paramètres.
 
Désolé, ça m'apprendra à pas lire les tutos quand je débute un language :(
 
Bonne journée !
Kmeleon

n°1573932
anapajari
s/travail/glanding on hfr/gs;
Posté le 12-06-2007 à 17:06:35  profilanswer
 

a pour ton probleme de compréhension de la portée des variables, la doc est pas mal faite: http://developer.mozilla.org/fr/do [...] e_variable


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [Résolu] Problème de return d'une fonction

 

Sujets relatifs
probleme de mise en page d'un formulaireProblème d'affichage avec la date (Anglais/Francais)
[Resolu] [php/mySQL JS?] Case a cocher evenementielle.[Résolu] phpMyAdmin et BR
Probleme de rafraichissementProbleme de clonage
Excel - VBA - Copier du texte au double clic [résolu]problème avec un modulo
Boucle sur fonction mail()[Résolu] /?page=contact
Plus de sujets relatifs à : [Résolu] Problème de return d'une fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR