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

Problème de return d'une fonction [Résolu] - HTML/CSS - Programmation

Marsh Posté le 11-06-2007 à 16:25:55    

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
Reply

Marsh Posté le 11-06-2007 à 16:25:55   

Reply

Marsh Posté le 11-06-2007 à 16:51:34    

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

 

ça risque pas de marcher, :D


Message édité par xtof_83 le 11-06-2007 à 16:52:03
Reply

Marsh Posté le 11-06-2007 à 17:03:59    

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 -_-

Reply

Marsh Posté le 11-06-2007 à 17:45:00    

/!\ 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
Reply

Marsh Posté le 11-06-2007 à 21:03:34    

up

Reply

Marsh Posté le 12-06-2007 à 08:15:52    

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
Reply

Marsh Posté le 12-06-2007 à 08:50:38    

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
Reply

Marsh Posté le 12-06-2007 à 13:03:49    

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...).

Reply

Marsh Posté le 12-06-2007 à 13:09:30    

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.

Reply

Marsh Posté le 12-06-2007 à 13:09:48    

Button back attacks again ::  sorry


Message édité par bignose le 12-06-2007 à 13:10:35
Reply

Marsh Posté le 12-06-2007 à 13:09:48   

Reply

Marsh Posté le 12-06-2007 à 13:45:15    

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]

Reply

Marsh Posté le 12-06-2007 à 16:18:11    

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...
 
 :??:

Reply

Marsh Posté le 12-06-2007 à 16:58:21    

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
Reply

Marsh Posté le 12-06-2007 à 17:05:40    

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

Reply

Marsh Posté le 12-06-2007 à 17:06:35    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed