sleep/wait/pause javascript
Posté le Vendredi 26 janvier 2007 à 11 h 10, Read it in english with GoogleAlors ça c’est le gros problème en se moment : faire une pause en javascript.
settimeout(func,time);
}
ceci n’est pas du script inline et il est impossible de l’utiliser en gardant toujours le meme corp de function.
Certain s’embarque dans des boucles qui font forcer votre processeur comme jamais :
var start = date.getTime();
while(start+time > date.getTime()) true;
return;
}
autant dire que ça fait déchets…
la seule solution possible actuellement semble etre de passer par le narrative javascript compiler qui lui va se débrouiller pour nous compiler un code qui va nous permettre de faire des pauses dedans.
var notifier = new EventNotifier();
setTimeout(notifier, millis);
notifier.wait->();
}
je trouve tout de meme abérant que cela ne soit pas inclus au javascript standard… ça limite fortement les possibilités de créer un code simple et facile à utiliser.
Mise à jour 24 juillet 2007 : Ajaxian a trouvé une implémentation du narrative javascript permettant de ne pas changer la syntaxe originale de javascript dans vos codes : javascript Strands




[...] généralement window.setTimeout(script, 0) mais ça ne marche pas même si on essaye d’attendre l’éxécution. Les variables voulant être définies ne seront disponibles que lors d’un apel non inline [...]
le Vendredi 6 avril 2007 @ 18 h 30Javascript est ‘hard-threated coded’, contrairement aux langages dits de haut-niveau (tels que le C/C++/Pascal/Delphi/ VB/Windev etc) ou de bas niveau (l’assembleur que l’on pourrait qualifier de parent des sus-précédents et d’enfant du langage machine).

Pour résumer simplement, les threads octroient à un programme l’exécution simultanée de plusieurs tâches en parallèle et, dans un environnement applicatif parfait, le « plantage » d’une ou plusieurs tâche(s) reste sans incidence sur le programme gestionnaire (Définition théorique)
Prenons l’exemple basique, mais réaliste, d’un applicatif de dessin ayant à prendre en compte 2 fonctions :
- L’une de remplissage de zones d’écran prédéfinies,
- L’autre de tracé en fonction du mouvement de la souris.
Après avoir tracé un cadre dont je dde le remplissage d’une couleur, je trace un trait. Mais durant que le traçage de ce trait, le remplissage continu à s’effectuer.
Que nous soyons « physiquement montés » x86 ou 68x, voire logiciellement « krosoft » ou « linux »(ou même MACosX) notre processeur a effectué un multitache préemptif (un partage de temps entre nos demandes et nos besoins).
Voir même un partage temps réel avec un bi ou quad core !!!! (Euh seulement une utopie, aucun prog ou si peut savent les procs multi-core).
Mais qu’en est il dans tout cela de notre Javascript ?????
Ben il reste toujours aussi ‘hard-threated coded’
Il est par là donc construit par un support ne supportant pas les threads.
Il est linéaire et interprèté !
Non, ne criez pas à sa mort :
- 1 : C’est le seul point commun existant entre moteurs Gecko, IE, Opera et autres !
- 2 : Il est le langage le plus décrié mais s’il est l’un des plus difficile à appréhender
(hormis le C/C++ et pis l’assembleur …)
il est l’un des plus agréable à pratiquer surtout en POO (Si si, Javascript en POO
c’est extra!!!!)
(’javascript oop’ sur le net pour ceux qui veulent vraiment l’apprendre)
- 3 : Il permet un web dynamique et mieux encore depuis que le pépé ‘Ajax’ a été sorti
des tiroirs ! Cf. Bindows par exemple !!!!!!!!!!!
Mais il n’est pas hard-threated. Toute action, toute cde lui étant soumis est « queued »
Et même ‘narrative javascript’ va s’appuyer sur ses fonctionnalités pour lui permettre de ‘pauser’.
Cela dit, ‘narrative javascript’, ‘Dojo’, ‘Prototype’ j’en oublie et pas des moindres, sont les frameworks sur lesquels doivent s’axer tous les futurs webdevs.
Arghhtt, J’avais oublié le meilleur : ‘jsquery’
Donc, il est bien évidemment possible de pauser son programme javascript interprèté …
Il existe quelques solutions.
Et sans nécéssité de frameworks.
Mais les lire donne l’envie d’aller plus loin
Enjoy !
c’est vrai, la pause en javascript n’est pas conseiller au-dela du fait qu’elle n’est pas réellement réalisable.
J’ai simplement écrit cet article car j’en avait besoin afin de tester la fonction evalglobal que j’ai créé sous le moteur KHTML (Konquero, safari..). J’avais pensé passer par setTimeout au départ, ce qui était une erreur.
testez ceci sur n’importe quel moteur, le résultat est impréssionnant :
setTimeout('var test = function(){ alert("test is a function"); }', 10);
var Start = (new Date()).getTime();
while(typeof test != 'function') {
if( ((new Date()).getTime() - Start) > 6000 ){
alert('test definitly undefined');
break;
}
}
if(typeof test == 'function') test();
La priorité d’éxécution est donnée au scope en cours ce qui délaisse la fonction envoyée à setTimeout.
I try your code, but « object EventNotifier not defined »
Exist any library with this?
yes, but it’s hard to implement : this is narrative JS
à titre d’info, j’ai vu une autre fonction qui permettrait de faire un semblant de pause bloquante …..
{
d=new Date();
diff=0;
while(diff < time)
{
n=new Date();
diff=n-d;
}
}
« un semblant de pause bloquante ….. » …. et qui bouffe tout le CPU, tu as oublié de dire !
Bonjour,
En regardant la référence Narative (http://www.neilmix.com/narrativejs/doc/reference.html) j’ai vu qu’il existait une méthode sleep.
Peut-être est-elle plus récente que ton article ?
Bonne journée,
Thoams
pour toute focntion du php vers le js allez voir :
http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_sleep/
Sleep en Javascript…
En php ; vous connaissez certainement la fonction sleep() qui permet d’endormir votre script pendant un laps de temps donné. Mais en javascript ; même s’il est possible de travailler avec des événements temporels ; il n’existe pas de fonction simila…
le Vendredi 6 novembre 2009 @ 10 h 22Bonjour à tous,
La solution ci-après me semble fiable :
Dans le code javascript, vous faites un appel à un code php (qui contient une pause) et continuez le code javascript uniquement après une réponse favorable du php.
Merci Ajax
lol ben tu m’apelle qu’en t’arrive à faire une requète ajax sans changer de contexte, parce que ça reviens à faire un setTimeout ton truc