Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

récupérer une variable créée dans une autre fonction

17 réponses
Avatar
Jibé
Bonjour,

J'ai une fonction httpxmlrequest qui va me chercher une valeur dans une
table. Afin de pouvoir réutiliser le code au maximum je voudrais
détacher ce que je fais du résultat de l'obtention du résultat lui même...
EN gros une fonction qui fait la requête et renvoie le résultat
puis une fonction qui appelle la première et traite le résultat pour
l'afficher.
N'étant pas hyper doué en javascript (mais je progresse...) je m'arrache
les cheveux sur le code suivant:

function trim(str) {
return str.replace(/(^\s*)|(\s*$)/g,"")
}
/* merci ASM */

function cherche(depart,requete,arrivee){
var xhr_object = null;
var x = depart;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.onreadystatechange = function(){
if(xhr_object.readyState == 4 && xhr_object.status == 200){
monresultat = trim(xhr_object.responseText);
}
}
xhr_object.open("POST",requete,true);
xhr_object.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
var data = "id="+x;
xhr_object.send(data);
}

function cherchegauche(depart,requete,arrivee){
if(document.getElementById(arrivee).style.display=='none'){
cherche(depart,requete,arrivee);
alert(monresultat);
document.getElementById(arrivee).innerHTML = monresultat;
document.getElementById(arrivee).style.display='block';

document.getElementById(depart+'_fleche').src='../images/icones/f_open.gif';
}
else

document.getElementById(depart+'_fleche').src='../images/icones/f_close.gif';
document.getElementById(arrivee).style.display='none';
}

Il se passe un truc étrange.
Au premier clic j'ai un magnifique "monresultat is indefined"
au second clic mon alert fonctionne mais rien d'autre ne se passe.

Si vous voyez ou je déc..... merci de m'aider
JiBé

10 réponses

1 2
Avatar
ASM
Bonjour,

J'ai une fonction httpxmlrequest qui va me chercher une valeur dans une
table. Afin de pouvoir réutiliser le code au maximum je voudrais
détacher ce que je fais du résultat de l'obtention du résultat lui même...
EN gros une fonction qui fait la requête et renvoie le résultat
puis une fonction qui appelle la première et traite le résultat pour
l'afficher.
N'étant pas hyper doué en javascript (mais je progresse...) je m'arrache
les cheveux sur le code suivant:

function trim(str) {
return str.replace(/(^s*)|(s*$)/g,"")
}
/* merci ASM */

function cherche(depart,requete,arrivee){
var xhr_object = null;
var x = depart;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets
XMLHTTPRequest...");
return;
}
xhr_object.onreadystatechange = function(){
if(xhr_object.readyState == 4 && xhr_object.status == 200){
monresultat = trim(xhr_object.responseText);


return monresultat;

ou direct :
return trim(xhr_object.responseText);

}
}
xhr_object.open("POST",requete,true);
xhr_object.setRequestHeader("Content-type",
"application/x-www-form-urlencoded");
var data = "id="+x;
xhr_object.send(data);
}

function cherchegauche(depart,requete,arrivee){
if(document.getElementById(arrivee).style.display=='none'){
cherche(depart,requete,arrivee);


ici il faut attendre le retour de la requette,
essayer :

var monresultat = cherche(depart,requete,arrivee);

alert(monresultat);
document.getElementById(arrivee).innerHTML = monresultat;
document.getElementById(arrivee).style.display='block';

document.getElementById(depart+'_fleche').src='../images/icones/f_open.gif';

}
else

document.getElementById(depart+'_fleche').src='../images/icones/f_close.gif';

document.getElementById(arrivee).style.display='none';
}

Il se passe un truc étrange.
Au premier clic j'ai un magnifique "monresultat is indefined"


oui, normal, puisqu'il n'est défini nulle part ...

au second clic mon alert fonctionne


normal aussi, la requette a eu le temps de se faire,
monresultat est maintenant connu.

mais rien d'autre ne se passe.


c'est à dire ?

(faudrait peut-être re-re-cliquer pour re-passer 'arrivee' en block ?)

--
ASM

Avatar
Jibé
Merci beaucoup pour ta réponse.


return monresultat;

ou direct :
return trim(xhr_object.responseText);


oui c'est ce que j'ai vu entre temps

function cherchegauche(depart,requete,arrivee){
if(document.getElementById(arrivee).style.display=='none'){
cherche(depart,requete,arrivee);


ici il faut attendre le retour de la requette,
essayer :
Je crois que c'est là que ça coince.

Comment attendre que monresultat soit défini?
Comment tester si monresultat est défini ?
Je me sens pas très doué dans ces cas là...



mais rien d'autre ne se passe.


c'est à dire ?
Ben tout ce qui concerne l'affichage, le changement d'image, etc...

Qui marche dans une fonction complète faisant tout le traitement.

(faudrait peut-être re-re-cliquer pour re-passer 'arrivee' en block ?)

('



Avatar
ASM

function cherchegauche(depart,requete,arrivee){
if(document.getElementById(arrivee).style.display=='none'){
cherche(depart,requete,arrivee);


ici il faut attendre le retour de la requette,
essayer :
Je crois que c'est là que ça coince.

Comment attendre que monresultat soit défini?


ben ... c'est prévu dans ta fonction de requête
(cf en fin de post pour readyState et status)

maRequete.readyState ...
maRequete.status ...

lancé par
monresultat = retourDeMaRequete(arguments);
soit pour toi :
monresultat = cherche(depart,requete,arrivee);

Comment tester si monresultat est défini ?



if( typeof (monresultat) == 'undefined') {
alert('L'est toujours pas defini c'truc !');
return;
}
else {
...
}

mais ... normalement ça a été vu dans cherche(), non ?


Pour relancer toutes les 1/2 secondes :

if(!monresultat) setTimeout(function() {
cherche(depart,requete,arrivee) }, 500);

Mais pas une très bonne idée me semble-ce ...

Je me sens pas très doué dans ces cas là...


http://www.toutajax.info/doku.php?id=readystate
http://www.toutajax.info/doku.php?id=status
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

http://www.xul.fr/xml-ajax.html

Exemple perso :
http://stephane.moriaux.perso.orange.fr/truc/hrequ/requete.js

--
ASM



Avatar
Jibé

mais ... normalement ça a été vu dans cherche(), non ?

Ben oui, c'est là que je ne comprends pas.

Si je mets tout dans la même fonction cad
la recherche via xmlhttprequest ET les fonctions d'affichage et de
modification de l'image tout fonctionne

Si je fais deux fonctions, une avec la recherche et l'autre récupérant
le résultat et gérant l'affichage, ça ne marche pas (monresultat est
indéfini).

j'ai essayer de faire une boucle pour gagner du temps et attendre la
réponse du serveur mais rien à faire pour le moment.
Pourtant ça m'arrangerait de gérer les choses en deux fonctions pour
réutiliser au maximum le fonction de requête quelque soit l'affichage à
gérer....

En tout cas merci pour les liens

JiBé


http://www.toutajax.info/doku.php?id=readystate
http://www.toutajax.info/doku.php?id=status
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

http://www.xul.fr/xml-ajax.html

Exemple perso :
http://stephane.moriaux.perso.orange.fr/truc/hrequ/requete.js



Avatar
ASM


mais ... normalement ça a été vu dans cherche(), non ?

Ben oui, c'est là que je ne comprends pas.

Si je mets tout dans la même fonction cad
la recherche via xmlhttprequest ET les fonctions d'affichage et de
modification de l'image tout fonctionne


et as-tu essayé :

function trim(str) {
return str.replace(/(^s*)|(s*$)/g,"")
}
/* merci ASM mais suis-je pour qque chose là dedans ? */

function cherche(depart,requete,arrivee){
var xhr_object = null;
var x = depart;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.onreadystatechange = function(){
if(xhr_object.readyState == 4 && xhr_object.status == 200){
return trim(xhr_object.responseText);
}
}
xhr_object.open("POST",requete,true);
xhr_object.setRequestHeader("Content-type","application/x-www-form-urlencoded");
var data = "id="+x;
xhr_object.send(data);
}

function cherchegauche(depart,requete,arrivee){
if(document.getElementById(arrivee).style.display=='none'){
monresultat = cherche(depart,requete,arrivee);
alert(monresultat);
document.getElementById(arrivee).innerHTML = monresultat;
document.getElementById(arrivee).style.display='block';

document.getElementById(depart+'_fleche').src='../images/icones/f_open.gif';
}
else

document.getElementById(depart+'_fleche').src='../images/icones/f_close.gif';
document.getElementById(arrivee).style.display='none';
}

--
ASM


Avatar
Jibé
et as-tu essayé :

function trim(str) {
return str.replace(/(^s*)|(s*$)/g,"")
}
/* merci ASM mais suis-je pour qque chose là dedans ? */
SI, SI il me semble bien que vous m'aviez déjà dépanné une fois pour un

problème de saut de ligne dans une réponse de xmlhttprequest sur ce même
forum

Pour la suite j'ai fait un copier coller directement et ça me renvoie
tjrs un monsesultat en indéfini.
C'est comme si la ligne
monresultat = cherche(depart,requete,arrivee);
de cherchegauche() n'était pas traitée.

Pourtant quand je regarde la console firebug, la requête est bien partie
et le résultat revenu.
C'est vraiment étrange ce truc. Et j'ai beau chercher sur le web je ne
trouve pas d'exemple où la réponse est traitée en dehors de la fonction.

JiBé

function cherche(depart,requete,arrivee){
var xhr_object = null;
var x = depart;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.onreadystatechange = function(){
if(xhr_object.readyState == 4 && xhr_object.status == 200){
return trim(xhr_object.responseText);
}
}
xhr_object.open("POST",requete,true);
xhr_object.setRequestHeader("Content-type","application/x-www-form-urlencoded");

var data = "id="+x;
xhr_object.send(data);
}

function cherchegauche(depart,requete,arrivee){
if(document.getElementById(arrivee).style.display=='none'){
monresultat = cherche(depart,requete,arrivee);
alert(monresultat);
document.getElementById(arrivee).innerHTML = monresultat;
document.getElementById(arrivee).style.display='block';

document.getElementById(depart+'_fleche').src='../images/icones/f_open.gif';

}
else

document.getElementById(depart+'_fleche').src='../images/icones/f_close.gif';

document.getElementById(arrivee).style.display='none';
}



Avatar
ASM
Pour la suite j'ai fait un copier coller directement et ça me renvoie
tjrs un monsesultat en indéfini.
C'est comme si la ligne
monresultat = cherche(depart,requete,arrivee);
de cherchegauche() n'était pas traitée.


dernières idées :

- essayer avec :
function cherche(depart,requete){
et dans cherchegauche(depart,requete,arrivee)
avec
monresultat = cherche(depart,requete);

- sinon voir à voir le détail de l'appel de la fonction
cherchegauche(...)
s'il n'y a pas un lézard par là (une ' oubliée ou qque chose)


Pourtant quand je regarde la console firebug, la requête est bien partie
et le résultat revenu.


donc l'alert a bien donné le résultat escompté ?

C'est vraiment étrange ce truc.


ça semble :-(

--
ASM

Avatar
Jibé


Pourtant quand je regarde la console firebug, la requête est bien
partie et le résultat revenu.


donc l'alert a bien donné le résultat escompté ?
Et non le alert me dit juste que monresultat undefined...

Et flutte.
Je vais regarder ce que vous suggérez dans le weekend.


C'est vraiment étrange ce truc.


ça semble :-(

EN tout cas merci beaucoup pour le temps consacré

JiBé


Avatar
Francis Spiesser
Jibé a formulé ce vendredi :


Pourtant quand je regarde la console firebug, la requête est bien partie
et le résultat revenu.


donc l'alert a bien donné le résultat escompté ?
Et non le alert me dit juste que monresultat undefined...

Et flutte.
Je vais regarder ce que vous suggérez dans le weekend.


C'est vraiment étrange ce truc.


ça semble :-(

EN tout cas merci beaucoup pour le temps consacré

JiBé


Essayez de déclarer la variable hors des fonctions pour voir :
<script type="text/javascript">
var monresultat='';

function trim(str) {
return str.replace(/(^s*)|(s*$)/g,"")
}

etc...
</script>

--
______
Francis (enlever .NIPUBNISOUMIS)
"Le présent n'est qu'un futur qui a vieilli"



Avatar
Jibé


Essayez de déclarer la variable hors des fonctions pour voir :
<script type="text/javascript">
var monresultat='';

function trim(str) {
return str.replace(/(^s*)|(s*$)/g,"")
}

etc...
</script>



ça marche pas :(
il continue a me dire que monresultat est undefined !
bon je jette l'éponge pour ce soir
Merci

JiBé

1 2