JavaScript Fonction Sleep

  • Carnix
  • Guru
  • Guru
  • Avatar de l’utilisateur
  • Inscription: Avr 28, 2004
  • Messages: 1099
  • Status: Offline

Message Juillet 13th, 2006, 5:44 am

Tous,

J'ai cherché partout dans la recherche d'un moyen de faire une réelle fonction sleep (Thread.Sleep, wait, sleep (), faites votre choix...) En JavaScript, et il y avait de nombreux postes autour de cette setInterval utilisation ou setTimeout, il n'y en avait aucun qui a effectivement fait un vrai sommeil.

Le problème, c'est la fonction setTimeout retourne immédiatement le contrôle à son récipient après avoir défini le retardateur. Donc, si vous setTimeout (funct (), 1000), et de son récipient fonctionne pendant 5 secondes de plus, les 4 dernières secondes pourrez voir les deux fonctions en cours au même moment. Maintenant, sans doute, ce qui est bon dans certains cas, peut-être même la plupart des cas en ce qui concerne les applications JavaScript. Toutefois, dans une demande de travail sur Ive été récemment, j'ai besoin de dormir réellement pour quelques secondes. Littéralement faire le décrochage script. La raison en est, Im en utilisant AJAX pour récupérer certaines données, mais son un pull très rapide, en prenant presque rien de temps, mais nous voulons à l'utilisateur de visualiser l'animation de traitement pour quelques secondes (pour affecter PSYCHIQUES...ses une sorte de quiz).

Donc, heres what I did. Son obviouls en fait assez, avec le recul, si Im surpris que je n'aie pas trouvé quelqu'un d'autre utilisant cette technique. Ceci est en fait un fichier à l'exception d'une classe plus large...Quoi qu'il en soit, il s'agit essentiellement pour la postérité, mais les commentaires sont les bienvenus. Oh, et Im sûr il ya de bonnes raisons pour ne manque pas normalement à faire cela, aussi, je suppose que si vous avez exécuté ce depuis trop longtemps, les navigateurs jetterait des erreurs ou des pannes...Je l'ai seulement besoin de 3-5 secondes, donc ce n'est pas un problème pour moi.


Code: [ Select ]
    this.Sleep = function ZZzzzZZzzzzzzZZZz(naptime){
        naptime = naptime * 1000;
        var sleeping = true;
        var now = new Date();
        var alarm;
        var startingMSeconds = now.getTime();
        alert("starting nap at timestamp: " + startingMSeconds + "\nWill sleep for: " + naptime + " ms");
        while(sleeping){
            alarm = new Date();
            alarmMSeconds = alarm.getTime();
            if(alarmMSeconds - startingMSeconds > naptime){ sleeping = false; }
        }        
        alert("Wakeup!");
    }
  1.     this.Sleep = function ZZzzzZZzzzzzzZZZz(naptime){
  2.         naptime = naptime * 1000;
  3.         var sleeping = true;
  4.         var now = new Date();
  5.         var alarm;
  6.         var startingMSeconds = now.getTime();
  7.         alert("starting nap at timestamp: " + startingMSeconds + "\nWill sleep for: " + naptime + " ms");
  8.         while(sleeping){
  9.             alarm = new Date();
  10.             alarmMSeconds = alarm.getTime();
  11.             if(alarmMSeconds - startingMSeconds > naptime){ sleeping = false; }
  12.         }        
  13.         alert("Wakeup!");
  14.     }


Cela fait partie d'une fonction de classe, et depuis j'ai aussi mon set var = this; juste au-dessus de toute catégorie JS j'écris, ce serait appelé en privé aussi my.Sleep (5), et publiquement comme myObject.Sleep (5 ) (en supposant que vous avez nommé le myObject objet, vous avez probablement wouldnt :wink: )

. c
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Juillet 13th, 2006, 5:44 am

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juillet 13th, 2006, 6:04 am

Avez-vous pensé à utiliser setTimeout de tuer un non-async XMLHTTPRequest demande?

Voilà la première chose qui vient à l'esprit.
Strong with this one, the sudo is.
  • Carnix
  • Guru
  • Guru
  • Avatar de l’utilisateur
  • Inscription: Avr 28, 2004
  • Messages: 1099
  • Status: Offline

Message Juillet 13th, 2006, 8:52 am

Je ne pense pas que. Im pas sûr que ce serait la meilleure idée que, puisque, pour la compatibilité cross-browser, Youd d'envoyer la demande à votre propre nom de domaine (plutôt que du charabia), qui, même si l'URL est intentionnellement mauvais (un 404, par exemple) , encore une force supplémentaire cycle HTTP sur votre serveur. Cette technique conserve tous les clients sur le lieu.

L'obligation a été d'un script de décrochage, indépendamment de la longueur de la demande prend de retourner une réponse. Techniquement, la façon dont j'ai mis en œuvre, la réponse est en fait déjà reçu et mis en cache lorsque le mode veille est invoquée...ce afin d'éviter tout délai d'expiration et d'assurer la réponse est effectivement accessibles au grand public lors de la sieste est finie, il devrait prendre plus de temps pour obtenir, pour une raison quelconque.

Même encore, avec setTimeout, Youd encore deux fonctions qui tournent en même temps, même si l'un est une demande de synchronisation XMLHTTP...JavaScript n'est pas multi-threadé, ce Ive a trouvé son généralement préférable de ne pas l'obliger à faire plus d'une chose à la fois, si possible...

. c


. c
  • Grey
  • Novice
  • Novice
  • No Avatar
  • Inscription: Juil 02, 2006
  • Messages: 34
  • Status: Offline

Message Juillet 13th, 2006, 9:07 am

Carnix a écrit:
avec setTimeout, Youd encore deux fonctions qui tournent en même temps
I wouldnt décrire de cette façon, car comme vous le dites, JavaScript n'est pas multi-threaded. Id avocat fait tout ce qui est nécessaire pour rendre l'utilisation d'un délai de plus de l'aide d'un processeur de fusion des bureaux de vote serré boucle.
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Juillet 13th, 2006, 9:28 am

Voilà ce qui arrive quand je ne suis pas tout lire dans un post.

Im pas sûr du tout en boucle.

Qu'est-ce que sur le démarrage de la fonction avec un appel à une désactivation de la fonction de contrôle, puis à un contrôle setTimeout réactivation fonction?
Strong with this one, the sudo is.
  • Carnix
  • Guru
  • Guru
  • Avatar de l’utilisateur
  • Inscription: Avr 28, 2004
  • Messages: 1099
  • Status: Offline

Message Juillet 13th, 2006, 9:53 am

Grey a écrit:
Carnix a écrit:
avec setTimeout, youd encore avoir deux fonctions de gestion au même moment
I wouldnt décrire les choses de cette façon, puisque comme vous le dites, JavaScript n'est pas multi-thread. Id préconisez tout ce qui est nécessaire pour rendre l'utilisation d'un délai d'attente de plus de l'aide d'un processeur de fusion boucle de vote serré.


Comme je le disais, je n'ai qu'à courir pendant quelques secondes. Plus que probablement, il écraserait un navigateur si vous le laissez trop longtemps (en fait, la plupart des navigateurs ces jours-ci sera effectivement en garde les utilisateurs et leur donner la possibilité d'arrêter les scripts quand ils semblent avoir fui, comme ce serait le cas si vous définissez pour aller pendant plus de quelques secondes).


Le problème avec setTimeout est encore qu'il IMMEDIATLY contrôle retourne à son conteneur, quelle que soit la fonction elle vient d'appeler fait. Donc, il n'ya pas de moyen de contrôle d'arrêt au milieu d'une fonction en utilisant setTimeout.

Maintenant, je suppose que vous pourriez faire quelque chose comme ceci:

Code: [ Select ]
function doProcess(){

//XMLHTTP processing....

showWaitDiv();
setTimeout(doNext(),5000);
return false;
}

function doNext(){
//Do whatever...
}

function showWaitDiv(){
//displays processing content
}
  1. function doProcess(){
  2. //XMLHTTP processing....
  3. showWaitDiv();
  4. setTimeout(doNext(),5000);
  5. return false;
  6. }
  7. function doNext(){
  8. //Do whatever...
  9. }
  10. function showWaitDiv(){
  11. //displays processing content
  12. }


Cela suppose, cependant, rien d'autre qu'il se passe, et que rien d'autre pourrait continuer, qui pourraient entrer en collision avec la doNext tirant en 5000ms, puisque le contrôle sera jamais le cas showWaitDiv () a été appelé, pas là où doNext () est...Cela interfère également avec passage de paramètre, mais thats facile de se déplacer par encapulation (ce qui est de savoir comment Im faisant cela de toute façon).

De toute façon, votre vélo reste le processeur pour M me X...setTimeout impossible de dire comment il fait en interne (sans doute un thread.sleep intégré dans le navigateur), qui est moins coûteuse que l'invocation d'une boucle while. Ill give this a essayer de voir comment il fonctionne, bien que Ive jamais eu beaucoup de chance avec setTimeouts...
. c
  • Carnix
  • Guru
  • Guru
  • Avatar de l’utilisateur
  • Inscription: Avr 28, 2004
  • Messages: 1099
  • Status: Offline

Message Juillet 13th, 2006, 10:33 am

Puisque le but est pour la postérité, sur la base des commentaires ici, j'ai tenté une approche setTimeout. Même s'il a travaillé plus ou moins les mêmes, il sorte de...senti .. mieux. Anyone whos développé des applications sait ce que je veux dire 8)

Heres what I did. J'ai découpé le code qui n'était pas liée à ce fil, et laissé de côté plusieurs autres méthodes qui n'étaient pas non plus liées...Il s'agit d'une grande classe près de 400 lignes (et ce n'est pas encore fini...). Anyway, there you go:

Code: [ Select ]
function theClassAllChoppedUpForOzzu(){
    var my = this;
    var ProcessingImage;
    var NAP;
    //CODE SNIPPED...

    this.Initialize = function main(){
        //CODE SNIPPED...
        my.ProcessingImage = new Image();
        my.ProcessingImage.src = my.ModuleDir + "processing.gif";
        //CODE SNIPPED...
    }


    this.Submit = function ClickClickClicketyGoesTheWebMonkey(f){
        //CODE SNIPPED...

            my.ToggleProcessorImage(true);
            my.HTTP_Request(my.DisplayQuizResults);

        //CODE SNIPPED...
    }


    this.HTTP_Request = function sendUpHTTPRequestLikeTheSeverNeedsAnotherOne(RESPONSE_HANDLER){
        //CODE SNIPPED...
        try{
            httpRequestObj.onreadystatechange = RESPONSE_HANDLER;
            //CODE SNIPPED...
        }
        catch(err){
            //CODE SNIPPED...
        }
    }

    this.DisplayQuizResults = function doSomethingWithTheServersReply(){
        try{
            if(httpRequestObj.readyState == 4){
                //CODE SNIPPED...
                my.NAP = setTimeout(my.Sleep,2000);
            }
        }
        catch(err){
        //CODE SNIPPED...
        }
    }

    this.ShowResults = function okReallyThisWillShowTheResults(){
        my.ToggleProcessorImage(false);
        //CODE SNIPPED...
    }

    this.Sleep = function ZZzzzZZzzzzzzZZZz(){
        my.ShowResults();
        return false;
    }
    
    this.ToggleProcessorImage = function showTheFunnySpinnerThing(flag){
        //CODE SNIPPED...
    }
}
  1. function theClassAllChoppedUpForOzzu(){
  2.     var my = this;
  3.     var ProcessingImage;
  4.     var NAP;
  5.     //CODE SNIPPED...
  6.     this.Initialize = function main(){
  7.         //CODE SNIPPED...
  8.         my.ProcessingImage = new Image();
  9.         my.ProcessingImage.src = my.ModuleDir + "processing.gif";
  10.         //CODE SNIPPED...
  11.     }
  12.     this.Submit = function ClickClickClicketyGoesTheWebMonkey(f){
  13.         //CODE SNIPPED...
  14.             my.ToggleProcessorImage(true);
  15.             my.HTTP_Request(my.DisplayQuizResults);
  16.         //CODE SNIPPED...
  17.     }
  18.     this.HTTP_Request = function sendUpHTTPRequestLikeTheSeverNeedsAnotherOne(RESPONSE_HANDLER){
  19.         //CODE SNIPPED...
  20.         try{
  21.             httpRequestObj.onreadystatechange = RESPONSE_HANDLER;
  22.             //CODE SNIPPED...
  23.         }
  24.         catch(err){
  25.             //CODE SNIPPED...
  26.         }
  27.     }
  28.     this.DisplayQuizResults = function doSomethingWithTheServersReply(){
  29.         try{
  30.             if(httpRequestObj.readyState == 4){
  31.                 //CODE SNIPPED...
  32.                 my.NAP = setTimeout(my.Sleep,2000);
  33.             }
  34.         }
  35.         catch(err){
  36.         //CODE SNIPPED...
  37.         }
  38.     }
  39.     this.ShowResults = function okReallyThisWillShowTheResults(){
  40.         my.ToggleProcessorImage(false);
  41.         //CODE SNIPPED...
  42.     }
  43.     this.Sleep = function ZZzzzZZzzzzzzZZZz(){
  44.         my.ShowResults();
  45.         return false;
  46.     }
  47.     
  48.     this.ToggleProcessorImage = function showTheFunnySpinnerThing(flag){
  49.         //CODE SNIPPED...
  50.     }
  51. }


(Oh yeah, les noms de fonction...heh, le nom de classe elle-même n'est pas que...mais les noms des fonctions privées...car ils sont plus ou moins hors de propos, j'ai aimé mon créative ).


Ainsi, monde, vous y aller. Un vrai débat sur les fonctions Javascript de sommeil qui a une alternative à l'utilisation de setTimeout, même si elle n'est pas la solution finale. Apprécier! =]

. c
  • acklenx
  • Born
  • Born
  • No Avatar
  • Inscription: Juin 08, 2007
  • Messages: 1
  • Status: Offline

Message Juin 8th, 2007, 10:10 am

Code: [ Select ]
/**
*@description pause( iMilliseconds ) Cause the single Javascript thread to hald/pause/sleep/wait for a specified period of time, by opening in modalDialog window (IE only) that modally locks the browser until it returns. This modal dialog is not opened to any page, but uses the Javascript: protocol to execute a javascript setTimeout. In this modal context the setTimeout, has the desired affect of preventing any other script execution. The sole purpose of the timeout execution script is to close the modal dialog which will return control/unluck the browser. The intention was to find a way to allow the UI to be updated and rendered in the middle of function/method without the need to split the method up, remove nested calls, or use closures. Used in this fashion to update the UI, a 0 (zero) is usually passed (or optionally omitted altogether) so that the only delay is for the UI to render.
*@version Note Please be aware that the user interface WILL update its rendering (if you've made and DOM/CSS/Text changes they will appear) and this may significantly slow down program execution if looping.
*@keywords pause sleep wait halt javascript show modal dialog set timeout multi-threaded single thread
*@version 1.2
* @param {Object} iMilliseconds [optional] the number of milliseconds the code will pause before returning - If no value is passed the code will returned immediately (as if a 0 were passed)
* @return undefined there is no return value from this function
*/
function pause( iMilliseconds )
{
  var sDialogScript = 'window.setTimeout( function () { window.close(); }, ' + iMilliseconds + ');';
  window.showModalDialog('javascript:document.writeln ("<script>' + sDialogScript + '<' + '/script>")');
}
  1. /**
  2. *@description pause( iMilliseconds ) Cause the single Javascript thread to hald/pause/sleep/wait for a specified period of time, by opening in modalDialog window (IE only) that modally locks the browser until it returns. This modal dialog is not opened to any page, but uses the Javascript: protocol to execute a javascript setTimeout. In this modal context the setTimeout, has the desired affect of preventing any other script execution. The sole purpose of the timeout execution script is to close the modal dialog which will return control/unluck the browser. The intention was to find a way to allow the UI to be updated and rendered in the middle of function/method without the need to split the method up, remove nested calls, or use closures. Used in this fashion to update the UI, a 0 (zero) is usually passed (or optionally omitted altogether) so that the only delay is for the UI to render.
  3. *@version Note Please be aware that the user interface WILL update its rendering (if you've made and DOM/CSS/Text changes they will appear) and this may significantly slow down program execution if looping.
  4. *@keywords pause sleep wait halt javascript show modal dialog set timeout multi-threaded single thread
  5. *@version 1.2
  6. * @param {Object} iMilliseconds [optional] the number of milliseconds the code will pause before returning - If no value is passed the code will returned immediately (as if a 0 were passed)
  7. * @return undefined there is no return value from this function
  8. */
  9. function pause( iMilliseconds )
  10. {
  11.   var sDialogScript = 'window.setTimeout( function () { window.close(); }, ' + iMilliseconds + ');';
  12.   window.showModalDialog('javascript:document.writeln ("<script>' + sDialogScript + '<' + '/script>")');
  13. }
  • Steve Waring
  • Born
  • Born
  • Avatar de l’utilisateur
  • Inscription: Sep 08, 2007
  • Messages: 1
  • Loc: Brierley Hill, West Midlands, UK
  • Status: Offline

Message Septembre 8th, 2007, 6:23 am

Cette dernière méthode est superbe. Concis et élégant. Enfin un moyen de rendre les changements en partie par le biais d'un script, et un bon sommeil trop.

Merci. :D
  • buggalugs
  • Born
  • Born
  • No Avatar
  • Inscription: Déc 12, 2007
  • Messages: 1
  • Status: Offline

Message Décembre 12th, 2007, 8:58 pm

Dommage qu'il ne fonctionne pas dans IE7. Il faut le reconnaître, il n'y a pas de dormir dans la fonction Javascript.
  • camperjohn
  • Guru
  • Guru
  • Avatar de l’utilisateur
  • Inscription: Nov 28, 2004
  • Messages: 1127
  • Loc: San Diego
  • Status: Offline

Message Décembre 13th, 2007, 11:30 am

Pourquoi ne pas faire de dormir sur le serveur en PHP.

Cela lui permet d'être indépendant du navigateur. Si le problème est que vous voulez les résultats apparaissent non-droit-là, alors peut-être que cela va marcher.
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • Mike Duskis
  • Born
  • Born
  • No Avatar
  • Inscription: Sep 30, 2008
  • Messages: 2
  • Status: Offline

Message Septembre 30th, 2008, 4:10 pm

Excellent concept, Carnix. Je pense que nous pouvons mettre en œuvre avec moins de code:
Code: [ Select ]
/**
* Delay for a number of milliseconds
*/
function sleep(delay)
{
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay);
}
  1. /**
  2. * Delay for a number of milliseconds
  3. */
  4. function sleep(delay)
  5. {
  6.     var start = new Date().getTime();
  7.     while (new Date().getTime() < start + delay);
  8. }
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Septembre 30th, 2008, 5:25 pm

Je n'arrive toujours pas à comprendre ce que utiliser une fonction de sommeil est JS. :scratchhead:
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Septembre 30th, 2008, 5:25 pm

Afficher de l'information

  • Total des messages de ce sujet: 26 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 234 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC