Un délai avec un while

Bonjour,

J’ai une variable qui se crée avec de l’ajax et il faudrait qu’une fonction la recupere et la retourne.

Le seul moyen est donc de faire quelque chose du genre :
while(!variable)
{
attendre 100 ms
}
return variable

Le problème c’est que je n’arrive pas à faire attendre la fonction. j’ai essayé en mettant setTimeout("",100) mais ça ne donne rien

setTimeout est asynchrone, c’est à dire que le navigateur continue à lire le script et lance la fonction en parallèle (comme avec un fork en fait).

Il ne faut pas utiliser un “while”:
en ajax on peut faire des appels syncrhones, et en asynchrone, on spécifie une fonction pour le retour.

edit:
www.xul.fr…

onReadyStateChange: permet d’affecter la fonction “retour” en mode asynchrone.
sinon, c’est sur le open(mode,url, boolean) qu’on peut passer en syncrhone en spécifiant “false”
Edité le 24/08/2007 à 14:26

J’aimerais mieux ne pas utiliser le syncrone parce que ça bloque l’ordinateur du visiteur

Mais le problème c’est qu’on ne peut pas retourner de valeur grace à onreadystatechange

Si j’ai le code suivant :

	var xmlhttp=GetHTTPObject();
	xmlhttp.open("GET",fichier,true);
	xmlhttp.onreadystatechange=function()
	{
		if(xmlhttp.readyState == 4) //là on mets l'action
	}
	xmlhttp.send(null);

Il faudra mettre après le “if(xmlhttp.readyState == 4)” un truc du genre document.getElementById(‘element’).value=xmlhttp.responseText
Hors moi ce que je voudrais c’est plutot un truc du genre return xmlhttp.responseText;
Hors ça ça ne marche pas parce que on lance une fonction en parallèle dont le temps d’execution est indefini.

Du coup en fait mon idée c’est d’associer dans un tableau un identifiant aléatoire correspondant au paquet XML et la variable xmlhttp.responseText.
Le problème c’est pour le recuperer. En fait mon code c’est :

function Main()
{
File('mapage.php') //le code ci-dessus
//en recuperant l'identifiant j'attends que la page soit chargée et qu'un xmlhttp.responseText soit associé à l'identifiant. C'est là qu'il y a le problème parce que je ne sais pas comment attendre
return resultat;
}

Edité le 24/08/2007 à 19:32

Normalement, pour ce que tu veux, et pour tous les comportement type “je clique sur un bouton qui fait un gros traitement”, on désactive ce qui a permet de lancer le traitement. (ie: tu ne dois plus pouvoir lancer ta fonction tant que tu es dans l’état “attente de données”, sauf cas spéciaux bien définis). Cela évite de bloquer l’utilisateur, et celui-ci est forcé d’attendre la fin de ton traitement, mais peut néanmoins faire autre chose en patientant.

Ta seconde problématique est lié à l’asynchronisme, il faut que tu le penses autrement justement : tu utilises une fonction qui dés que readyState passe à 4, fait quelque chose (ce que tu dis justement).

Tu ne peux pas, avec le caractère asynchrone t’attendre à un return, en tout cas, pas comme ça :slight_smile: c’est soit ça return et ça bloque l’utilisateur, soit ça ne return pas, et ça ne bloque pas:)

Pour l’histoire des identifiant aléatoire en fait ça n’est pas important, je peux très bien m’en passer finalement

Le plus gros problème pour moi c’est en fait cette histoire d’attendre pour recuperer ma variable. Il est primordiale, vu l’architecture du site et le grand nombre de fonctions se basant sur celle-ci que je fasse du tout en 1. c’est à dire: j’appelle la fonction, elle me retourne un resultat. Pour cela, il suffit de regler le problème de la recuperation de la variable parce que sinon ma fonction ne sait pas quand elle doit redemarrer. L’architecture est donc

J’appelle la fonction qui envoi le paquet XML (if(xmlhttp.readyState == 4) VariableGlobale=xmlhttp.responseText;)
tant que pas VariableGlobale
{
attendre
}
return VariableGlobale;

Tout les moyens sont bon : retenter sa chance toute les x millisecondes, mettre la fonction en pause et la redemarrer après le if(xmlhttp.readyState == 4), etc. Le problème c’est que je me demande si une seule de ces solutions est possbile

Le mieux est presque de faire du synchrone, ça sera moins pire que le while (…).

et que donnerai le while ?

Deux choses :

  1. ça fera beaucoup plus ramer le PC (ou le navigateur) que l’attente synchrone (j’ai déjà fait des boucles infinies par erreur)
  2. le navigateur verrait que le script est en train de freezer l’application, et proposerait à l’utilisateur de le killer.

Tu parles de l’architecture de ton site? Ie: tu cliques sur un lien, et ça charge un contenu interne, façon Ajax?

Voir façon clubic quand tu cliques sur “Envoyer” ? Si oui, alors pose toi la question de ce qui se passe sans Ajax : l’utilisateur attend aussi, et dans ce cas, l’attente synchrone est supportable.

ok mais j’avoue ne toujours pas être convaincu par le synchrone. Quelqu’un qui a du 56KB sera dans la merde
Tandis que si on fait une recherche de la variable tous les 300 millisecondes ça ne fait pas beaucoup ramé le pc et on peut créer un système pour qu’au bout de x essais le while s’arrête