Forum Clubic

Ajax synchrone pour simuler setTimeout

Bonjour, j’ai cherché maintes fois sur Google pour trouver une fonction setTimeout qui met le script en pause, sans réussite (si vous avez la fonction, give :smiley: )
Pour contrer, j’ai décider de faire une requête ajax synchrone sur une page PHP qui fait un sleep du temps donné. Astucieux me diriez vous (sisi vous le dites ! x] )
Cela marche à merveille sous Firefox exemple:


function time(sec)
{
	$.ajax({
		async: false,
		type: "POST",
		url: "time.php",
		data: "time=" + sec,
		success: function(msg){
   }
 });
}
document.write('Phase 1 ? - OK<br/>');
time(10);
document.write('Phase 2 ? - OK');

et le PHP


sleep($_POST['time']);
echo $_POST['time'];

J’obtiens “Phase 1 ? - OK” et 10 secondes après “Phase 2 ? - OK”
Mais sous Chrome la page charge et 10 secondes après j’ai les deux messages en même temps.
Je ne parle pas de IE, hein, vous connaissez le résultat.

Help !
Merci
Edité le 29/08/2010 à 12:02

Peut-être que parce document.write doit être fait après le chargement du document, et que faire un sleep équivaut à “endormir” le script, et ne pas finaliser le chargement.

Quoiqu’il en soit, ça me semble bizarre ce que tu veux faire.

Bah tu fragmentes ta fonction en deux, et tu appelles l’autre fonction avec setTimeout et tu l’as ta pause.

Je veut faire une pause en Javascript: setTimeout continue l’execution du script. Je veut une fonction qui arrete le chargement du script lorsqu’elle est appelée

Mais ma fonction c’est juste une requête ajax simplifiée par jQuery (j’avais oublié de le préciser mais c’est quand même clair); je ne peut pas la couper en deux Oo

Mais quel intérêt de faire une pause ? C’est pas comme si tu faisais du polling, et même si c’est le cas, en javascript c’est window.setTimeout ou window.setInterval.

Pire : en passant par AJAX, tu rends une thread serveur complètement inaccessible pendant 10 secondes. ie: tu perds une connexion dédiée à rien foutre…
Edité le 22/08/2010 à 13:43

Tu fais une page blache, tu met comme code

<script>
document.write("oyo");
setTimeout("alert('i');", "3000");
document.write("iyi");
</script>

Tu vois quoi ? oyoiyi d’un coup et 3 secondes après 3 secondes, tu vois la alert.
Moi je veut une pause alors la solution c’est de mettre tout le code dans la setTimeout, mais je veut pas.
Tu vois une fonction, qui afficherait oyo, 3secondes après le reste du code. C’est pas compliqué a comprendre.

Je pense pas non. Le serveur pouvant traiter plusieurs pages à la fois, quand il voit sleep, il empêche l’envoie de la page avant le nombre; mais il continue à traiter les autres pages.

Bah c’est pourtant la solution … Si ça t’amuses de chercher autre chose, bah OK ça peut toujours être intéressant pour ta culture personelle, maintenant setTimeout et setInterval sont là pour faire ce que tu veux :oui: …

Euh, t’es en javascript, donc côté client, pas côté serveur … quand ta requête ajax part, ça ouvre une connection HTTP au serveur, qui va la handle jusqu’au retour … Si tu delayes la réception du retour par le client, ça va en effet te coincer une connection …

Le serveur peut traiter un certains nombre de connexions, et pis c’est tout hein :slight_smile: Si tu utilises pour des conneries la connexion pendant 30 secondes, ça sera 30 secondes perdues…

Bref. use window.setTimeout(), en passant une fonction en paramètre, qui fera ce que tu veux et puis c’est tout…

<script type="text/Javascript">

function oyo()
{
 document.write("oyo");
}

function iyi()
{
 alert("i");
 document.write("iyi");
}

oyo();
setTimeout(iyi, 3000);

</script>

Edité le 23/08/2010 à 18:53

Oui, c’est malheureusement ce que je vais devoir faire… Merci :slight_smile:

Edit: malheureusement parce que sur un code très long, ça fait très moche :smiley:
Edité le 24/08/2010 à 11:55

Autre façon : tu joues sur les propriétés de tes éléments, ça change dans le script seulement le fait qu’au lieu de writer le reste du document, il est déjà chargé dans une balise cachée, et tu change juste la visibilité de cette balise dans le timeout.
Après je sais pas quelle est la méthode la plus économe, mais ça semble pas être ta priorité!

C’est une bonne idée; et le script marchera quelques soit les méthodes, (je pense d’ailleurs que la tienne est la mieux); et la priorité ce n’était pas la souplesse du JS; mais on m’a enguelé et j’avais déjà tout refais avec les fonctions, dommage :slight_smile: (je ferais ca a la fin, pour l’instant on veut le rendu) :slight_smile:
Merci :slight_smile:

Edit du top => Résolu