Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Reception d'une reponse XMLHTTPrequest

Envoyé par : syl

Date : 10/10/2006 10:18

Bonjour,

J'ai un probleme un peu idiot et qui m'empeche d'avancer. Je réalise un transfert de donnée via XMLHTTPrequest qui fonctionne tres bien. Mais je ne sais pas comment attendre la réponse et continuer mon script en conséquence.

var reponse={ message:null , attente:false, nbcycleattente : 20 };

function Requete(action, param)
{	var req;
	this.envoyer = envoyer();
	
	function analyseReponse()	// analyse de la réponse XML
	{	var xmlo = req.responseXML.documentElement;
		reponse.message = xmlo.getElementsByTagName("msg")[0].textContent;								// message transmis par le serveur
		return true;
	}
	
	function envoyer()																					// envoi de la requete
	{	req = new XMLHttpRequest();																	// Création de l'objet AJAX
			req.open("POST", SERVEUR_AASE, true);														// ouverture requete via methode POST et asynchrone
			req.onload = function(){return true;}														// config objet AJAX
			req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
			req.onreadystatechange = function()
			{	if (req.readyState == 4)																// si reponse disponible 
				{	reponse.attente = false;															// 
					if (req.status == 200) 	analyseReponse(); 																	// si pas d'erreur serveur on lance analyseReponse()	
				}
				return true;
			}
			var str ='action='+action;														
			 			req.send(param);															// envoi du corps de requete
	}
}

function attenteReponse()
{	if(reponse.attente && reponse.nbcycleattente > 0)
	{	reponse.nbcycleattente --;
		setTimeout(attenteReponse, 250);
	}
	else
	{	alert(reponse.message);
		
	}
}

Voici le code qui lance tous ça :

reponse.attente = true;
var r = new Requete("login", 1);
r.envoyer;
reponse.nbcycleattente = 20;
attenteReponse();
blabla javascript;

J'aimerais donc que "blabla javascript" ne s'execute qu'une fois la réponse arrivée. Mais je ne vois pas de moyen pour le faire sans mettre mon "blabla javascript" dans le else de la funtion attenteReponse(), ce qui m'embete un peu. Y-a-t-il un moyen propre de resoudre ça ? !-)

Merci

Syl

# Re: Reception d'une reponse XMLHTTPrequest

Envoyé par : papy

Date : 10/10/2006 12:43

C'est faisable très facilement. En fait tu peux lancer une requête de deux façons, asynchrone et synchrone (ce qu'il te faut)

Dans ton exemple tu utilise la méthode asynchrone (en passant elle est un peu plus compliqué :D)

Pour utiliser la méthode synchrone, tu passe false en dernier argument de la méthode open, et pas besoin de définir la fonction onreadystatechange. Ensuite tu n'a plus qu'à apeller la méthode send, et cette dernière ne se termine qu'une fois la réponse récupérée. L'inconvénient étant que cela bloque tout l'interface.

Voila un petit exemple :

var xmlhttp = new XMLHttpRequest();
req.open("POST", SERVEUR_AASE, false);
req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
req.send(param);

var reponse = req.responseXML;

Sinon avec la méthode asynchrone tu peux aussi déclarer ton code dans une fonction et la passer en paramètre pour qu'elle soit executée lorsque la réponse arrive. De cette facon l'interface ne sera pas bloquée si la réponse est longue. Ca donnerai quelque chose du genre :

code d'appel

function blabla(reponse) {
    bla bla javascript
}

var r = new Requete("login", 1, blabla);
r.envoyer;

code d'execution de la requete

function Requete(action, param, blabla) {
    var req;
    this.envoyer = envoyer();

    function analyseReponse() {
        ...

        blabla(valeur);
    }

    ...
}

# Re: Reception d'une reponse XMLHTTPrequest

Envoyé par : thx1138

Date : 10/10/2006 12:51

Hi,

Cela m'a l'air un peu compliquer

moi j'utilise une et une seule fonction AJAX POST true je l'ai trouvé sur le web et l'ai modifier un peu

function ajax_post(url, param)
{
var xhr_object = new XMLHttpRequest();

xhr_object.open("POST", url, true);

xhr_object.onreadystatechange = function()
{
	if (xhr_object.readyState == 4)
		eval(xhr_object.responseText);
}

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr_object.send(param); 
}

il suffit donc, de passer en paramètre le fichier serveur (par ex: php) et param tu ajoutes les valeurs (par ex: "action="+action+"&nom="+nom...)

ATTENTION,

Cette fonction ne renvoie rien, il faut mettre directement le code js dans le fichier php. C'est beaucoup plus facile de cette manière, car on ne dois pas récupérer une énorme chaine avec plein de séparateurs.

# Re: Reception d'une reponse XMLHTTPrequest

Envoyé par : syl

Date : 10/10/2006 14:09

Merci pour vos réponses. Pappy, effectivement, je connaissais le mode synchrone et ce que je veux ressemble à cela mais je ne voulais pas figer mon interface (pas tres ergonomique). Je pense qu'il n'y a pas de solution simple pour cela, je vais donc suivre ton conseil et passer une fonction à l'objet Requete (c'est plus ou moins ce que je faisais d'ailleur...). DOmmage car ça fait des fonctions en plus plutot qu'un beau code qui se déroule simplement ...!

Merci aussi thx1138, ta méthode ressemble à ce qui est fait en JSON, mais j'appréhende un peu d'utiliser eval() sans controle comme ça... Pour ce qui est du retour de la fonction, on peut retourner un XML qu'il est aisé de parser.

Bonne journée

Syl

# Re: Reception d'une reponse XMLHTTPrequest

Envoyé par : thx1138

Date : 10/10/2006 17:57

Je ne vois pas ou est le problème,

J'utilise cette fonction dans une multitude de pages et tout fonctionne sans problème. texte, nombre...

1 seul fonction à appeler et le tour est joué.

# Re: Reception d'une reponse XMLHTTPrequest

Envoyé par : papy

Date : 10/10/2006 18:10

Cherche un peu sur le net et tu verras que l'usage d'eval est assez controversé, c'est trop permissif et ca peut amener des problèmes.

En ce qui concerne le fait que ca soit simple, c'est indéniable, mais si tu utilise du XML et la propriété responseXML tu n'a pas besoin de mettre des séparateurs partout, tu récupère un document XML avec lequel tu peux travailler en utilisant le DOM. Un peu moins simple mais beaucoup plus propre ;)

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.