sleep/wait/pause javascript

Posté le vendredi 26 janvier 2007 à 11 h 10, Read it in english with Google

Alors ça c’est le gros problĂšme en se moment : faire une pause en javascript.

Attention je parle de pause ‘in-line’ et pas de lancement de fonction avec settimeout :

function sleep(time, func) {
    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 :

function sleep(time){
    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.

function sleep(millis) {
    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

20 réponses à “sleep/wait/pause javascript”

  1. javascript eval global final contient sur le sujet :

    […] 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 30
  2. pkoipas

    Javascript 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 !

  3. XoraX

    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 :

    test = undefined;
    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.

  4. matej

    I try your code, but « object EventNotifier not defined »
    Exist any library with this?

  5. XoraX

    yes, but it’s hard to implement : this is narrative JS

  6. alex

    Ă  titre d’info, j’ai vu une autre fonction qui permettrait de faire un semblant de pause bloquante …..

    function mapause(time)
    {
       d=new Date();
       diff=0;
        while(diff < time)
        {
          n=new Date();
          diff=n-d;
         }
    }
  7. tMS

    « un semblant de pause bloquante 
.. » …. et qui bouffe tout le CPU, tu as oubliĂ© de dire !

  8. Thoams

    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 😉

  9. création de site web

    pour toute focntion du php vers le js allez voir :
    http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_sleep/

  10. MĂ©thylbro contient sur le sujet :

    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 22
  11. themoule

    Bonjour Ă  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 🙂

  12. XoraX

    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 😀

  13. pneus

    Tu peux faire un appel ajax synchrone… Mais quel arsenal pour une tache aussi bĂ©nigne !

  14. Elendil

    Hello,

    Je pense avoir trouvé une solution pour créer un « wait » sans faire appel au serveur.
    Pour ce faire, il faut crĂ©er une applet avec une fonction « jsWait » (parce qu’on peut pas redĂ©finir la fonction « wait » standard de la classe « Object ») :

    ——————————————————–
    import java.applet.Applet;

    public class MomApplet extends Applet {

    private Object synchro = new Object();

    //fonction d’attente passive
    public void jsWait(long timeInMillis) {

    synchronized(synchro) {

    try {

    synchro.wait(timeInMillis);

    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }

    }

    }
    ——————————————————–

    Ensuite, aprĂšs compilation de l’applet, il suffit de l’inclure dans la page :

    ——————————————————–

    ——————————————————–

    Et pour finir, il suffit de crĂ©er une fonction javascript qui fait appel Ă  la mĂ©thode de l’applet :

    ——————————————————–
    function wait(timeInMillis) {

    document.getElementById(‘monApplet’).jsWait(timeInMillis)

    }

    Et voila ! Je n’ai testĂ© ça qu’avec Firefox, mais ça devrais fonctionner avec tous les browsers pour autant qu’ils acceptent de faire tourner des applets…

  15. Elendil

    Ooops ! Visiblement il a prit mes balise Ă  la lettre… Voici ce qui devait figurer

    applet id= »monApplet » code= »MonApplet.class » codeBase= »{chemin relatif vers le rĂ©pertoire de l’applet} »

  16. Bisra

    Bravo Elendil !
    J’ai utilisĂ© la classe avec la fonction JsWait et c’est super..
    VoilĂ  mon html d’essai:

    function wait(timeInMillis) {
    document.getElementById(« id_tempo »).jsWait(timeInMillis)
    }

    document.write(‘DĂ©but temporisation’);
    wait(5000);
    document.write(‘Fin temporisation’);

  17. antoineg

    Une requĂȘte ajax qui appelle un php avec un sleep ? Vraiment tordu …

    Pourquoi simplement prendre en compte que ce language n’a pas Ă©tĂ© developpĂ© pour effectuer des pauses ?

    De plus je pense que tu ne comprends pas trĂšs bien le mot AJAX, oui dedans il y a asynchrone. Cela veut dire que ca requĂȘte ne bloque pas l’exĂ©cution de code … plutĂŽt ridicule donc !

    Si c’est pour appeler une request ajax et dans le retour appeler ton code … autant faire un setTimeout …

    Evite de donner des idées stupides.

  18. DrMad

    @antoineg
    Pas de synchrone en AJAX ? A quoi sert le boolĂ©en dans la fonction open de l’XHR alors ?
    Merci de nous expliquer au lieu de lancer des phrases dĂ©finitives …
    🙂

  19. dem

    un des codes marche pour crĂ©er une pause mais je n’arrive pas a faire de transaction, pouvez vous m’aider a faire cela?

  20. DENIS

    sous IE, il y a les activeX…
    un vbs avec :
    Wscript.Sleep Wscript.Arguments(0)
    et dans le html:
    // pause script
    WshShell = new ActiveXObject(« WScript.Shell »);
    var sNewCmd = ‘ »D:/SkyDrive/Prive/Systeme/Outils/JavaScript/WebPerso/VB_sleep.vbs » 600’;
    WshShell.run(sNewCmd, 1, true);
    😉

Laissez un commentaire :