Il n'y a pas de méthode de sommeil dans JS. Si vous voulez hiberner, vous devez définir vous-même une méthode.
fonction sleep (nombreMillis) {var now = new Date (); var exittime = now.gettime () + nombreMillis; while (true) {maintenant = new Date (); if (now.gettime ()> quitte) return; }}Voici les ajouts:
En plus de la narration JS, JWACS (JavaScript avec support de continuation avancé) est également engagé à éviter d'écrire des fonctions de rappel qui sont gênantes appelées de manière asynchrone en étendant la syntaxe JavaScript. Le sommeil implémenté avec JWACS, le code est le suivant:
La copie de code est la suivante:
fonction Sleep (msec) {
var k = function_continuation;
setTimeOut (function () {ressume k <- mesC;}, msec);
suspendre;
}
Cette syntaxe est encore plus effrayante, et c'est un nom de méthode de thread qui n'est pas recommandé dans Java. Franchement, j'ai tendance à narrative JS.
Comme le narrative JS, les JWCS doivent également être précompilés et le précompilateur est écrit en langue lisp. C'est aussi la version alpha en ce moment. Pour plus de présentations et de comparaisons des deux, veuillez vous référer au nouvel article sur SitePoint: Eliminal Async JavaScript Rappels en prétraitement
Lors de l'écriture de scripts JavaScript complexes, il est parfois nécessaire d'espérer que le script peut se décrocher pendant une période de temps spécifiée, similaire à l'effet obtenu par le thread.Sleep in Java ou la commande de sommeil dans le script sh.
Comme nous le savons tous, JavaScript ne fournit pas de fonctions de contrôle de thread similaires à Java. Bien qu'il existe deux méthodes, Settimeout et SetInterval, qui peuvent effectuer un contrôle d'exécution chronométré, ils ne peuvent pas répondre à toutes les exigences. Il y a toujours eu beaucoup de gens qui ont demandé comment mettre en œuvre le sommeil / pause / attendre en JavaScript, et il existe en effet des solutions très boiteuses:
La façon la plus simple et la pire est d'écrire une boucle, le code peut être le suivant:
La copie de code est la suivante:
fonction Sleep (NumberMillis) {
var now = new Date ();
var exittime = now.gettime () + nombreMillis;
while (true) {
maintenant = new Date ();
if (now.getTime ()> quitter)
retour;
}
}
Le code ci-dessus ne dort pas l'interprète de script, et il a également pour effet d'augmenter rapidement le CPU à une charge élevée. Le navigateur sera même dans un faux état de mort pendant cette période.
Deuxièmement, les personnes intelligentes utilisent l'implémentation spéciale de la boîte de dialogue d'IE pour se connecter les uns aux autres. Le code peut être le suivant:
La copie de code est la suivante:
Fonction Sleep (Timeout) {
window.showmodaldialog ("javascript: document.writeln ('<cript> window.setTimeout (function () {window.close ();}," + timeout + "); <// script>');");
} window.Alert ("avant le sommeil ...");
Sleep (2000);
Window.Alert ("After Sleep ...");
Inutile de dire que seuls les supports IE (IE7 ne peuvent pas atteindre son objectif en raison de restrictions de sécurité).
En outre, il existe également des astuces telles que l'utilisation de l'applet ou d'appeler Wscript.Script.Sleep () de l'hôte de Windows, qui sont tous en dernier recours.
Enfin, il y a des gens plus intelligents qui ont peut-être développé la meilleure solution. Regardons d'abord le code:
La copie de code est la suivante:
Fonction Sleep (Millis) {
var notifier = njsruntime.CreateNotifier ();
setTimeout (notificateur, millis);
notifier.wait -> ();
}
C'est vrai, voir la syntaxe de -> () est étonnant pour voir la fonction $ () du prototype. Cependant, ce script rapportera des erreurs de syntaxe directement dans le navigateur. En fait, ils doivent être précompilés en JavaScript approuvé par le navigateur client. Le script compilé est le suivant:
La copie de code est la suivante:
Fonction Sleep (Millis) {
var njf1 = njen (this, arguments, "millis");
NJ: tandis que (1) {
try {switch (njf1.cp) {
Cas 0: njf1._notifier = njsruntime.createNotifier ();
setTimeout (njf1._notifier, njf1._millis);
njf1.cp = 1;
njf1._notifier.wait (njf1);
retour;
Cas 1: Break NJ;
}} catch (ex) {
if (! njf1.except (ex, 1))
retour;
}}
njf1.pf ();
}
Je ne peux pas le comprendre et je ne veux plus le comprendre. Toutes ces tâches seront mises en œuvre par narrative JavaScript - une extension JS qui fournit pour nous des fonctionnalités de blocage asynchrones. Nous n'avons qu'auparavant d'écrire la syntaxe étrange -> (), puis d'implémenter l'effet de sommeil par compilation pré-statique ou compilation dynamique du premier plan.
Narrative JavaScript prétend vous libérer des fonctions de rappel étourdi et écrire des tâches de longue date claires. Actuellement, il s'agit toujours de la version d'Alpha, et il y a un exemple de bouton mobile sur l'exemple. Le téléchargement du code source est également disponible sur la page d'accueil. Avec mes connaissances de base faibles, je ne peux à peine voir que l'implémentation de la machine d'état est simulée dans le code. J'espère que les amis qui maîtrisent les algorithmes pourront l'analyser pour nous.
Enfin, j'ai toujours eu mon point de vue: veuillez garder JavaScript simple à moins que ce soit nécessaire. Avant que JavaScript ne puisse fournir un support de filetage natif, nous pouvons peut-être modifier la conception pour éviter les applications de blocage asynchrones.
Une implémentation tortueuse des bogues
<Type de script "Text / JavaScript"> / * Implémentation de la fonction de pause dans JavaScript JavaScript lui-même n'a pas de fonction de pause (le sommeil ne peut pas être utilisé) en même temps, VBScript ne peut pas utiliser Doevents, alors écrivez cette fonction pour implémenter cette fonction. JavaScript est un langage d'objet faible et une fonction peut également être utilisée comme objet. Par exemple: [code] fonction test () {alert ("hellow"); this.nextStep = function () {alert ("nextStep"); }} Nous pouvons appeler var myTest = new Test (); myTest.NextStep (); Lorsque nous faisons une pause, une fonction peut être divisée en deux parties, inchangée avant l'opération de pause, et mettre le code à exécuter après la pause dans ce.NextStep. Afin de contrôler la pause et la continuation, nous devons écrire deux fonctions pour implémenter respectivement les fonctions de pause et de continuation. La fonction PAUSE est la suivante: * / fonction Pause (obj, imiNECOND) {if (window.eventList == null) window.eventList = new Array (); var ind = -1; for (var i = 0; i <window.eventList.length; i ++) {if (window.eventList [i] = null) {window.eventList [i] = obj; ind = i; casser; }} if (ind == - 1) {ind = window.eventList.length; window.eventList [Ind] = obj; } setTimeout ("Goon (" + Ind + ")", 1000);} / * Cette fonction met la fonction à faire une pause dans la fenêtre du tableau.eventList, et en même temps appelle la fonction continue via setTimeout. La fonction continue est la suivante: * / fonction Goon (Ind) {var obj = window.eventList [Ind]; window.eventList [Ind] = null; if (obj.nextStep) obj.nextStep (); else obj ();} / * Cette fonction appelle la méthode NextStep de la fonction suspendue. Si cette méthode n'est pas disponible, la fonction sera à nouveau appelée. Une fois la fonction écrite, nous pouvons écrire le volume suivant: * / fonction test () {alert ("hellow"); Pause (ceci, 1000); // appelant la fonction de pause this.nextStep = function () {alert ("nextStep"); }} </ script>