Es gibt keine Schlafmethode in JS. Wenn Sie Winterschlaf erhalten möchten, müssen Sie selbst eine Methode definieren.
Funktion Sleep (numbermillis) {var now = new Date (); var exittime = now.getTime () + numbermillis; while (true) {nun = new Date (); if (now.getTime ()> exittime) return; }}Das Folgende sind die Ergänzungen:
Zusätzlich zu Narrative JS ist JWACS (JavaScript mit fortgeschrittener Fortsetzungsunterstützung) verpflichtet, Rückruffunktionen zu vermeiden, die asynchron sind, die durch Erweiterung der JavaScript -Syntax bezeichnet werden. Der mit JWACS implementierte Schlaf ist der Code wie folgt:
Die Codekopie lautet wie folgt:
Funktion Schlaf (msc) {
var k = function_continuation;
setTimeout (function () {resume k <- mesc;}, msc);
aussetzen;
}
Diese Syntax ist noch beängstigender und es ist ein Thread -Methodenname, der in Java nicht empfohlen wird. Ehrlich gesagt neige ich zu narrativen js.
Wie narrative JS muss auch JWACs vorkompiliert werden, und der Präkompiler ist in Lisp -Sprache geschrieben. Es ist im Moment auch die Alpha -Version. Weitere Einführungen und Vergleiche der beiden finden Sie im neuen Artikel auf SitePoint: Eliminieren von Async JavaScript -Rückrufen durch Vorverarbeitung
Beim Schreiben komplexer JavaScript -Skripte besteht manchmal die Notwendigkeit zu hoffen, dass das Skript für einen bestimmten Zeitraum stehen kann, ähnlich dem Effekt, der durch den Thread erzielt wird.
Wie wir alle wissen, bietet JavaScript keine ähnlichen Thread -Steuerfunktionen wie Java. Obwohl es zwei Methoden gibt, SetTimeout und SetInterval, die eine zeitgesteuerte Ausführungsregelung durchführen können, können sie nicht alle Anforderungen erfüllen. Es gab immer viele Leute, die gefragt wurden, wie man Schlaf/Pause in JavaScript implementiert, und es gibt in der Tat einige sehr lahme Lösungen:
Der einfachste und schlimmste Weg ist, eine Schleife zu schreiben, der Code kann wie folgt sein:
Die Codekopie lautet wie folgt:
Funktionsschlaf (numbermillis) {
var nun = new Date ();
var exittime = now.getTime () + numbermillis;
while (wahr) {
jetzt = neues Datum ();
if (now.getTime ()> exittime)
zurückkehren;
}
}
Der obige Code schläft tatsächlich nicht den Skript -Interpreter und hat auch den Einfluss, die CPU schnell auf hohe Last zu erhöhen. Der Browser wird sogar für diese Zeit in einem gefälschten Todeszustand sein.
Zweitens verwenden intelligente Personen die Implementierung des speziellen Dialogfelds von IE von IE, um eine Verbindung miteinander zu erreichen. Der Code kann wie folgt sein:
Die Codekopie lautet wie folgt:
Funktion Schlaf (Zeitüberschreitung) {
window.showmodaldialog ("javaScript: document.writeln ('<Script> window.settimeout (function () {window.close ();}," + timeout + "); <// script>');");
} window.alert ("vor dem Schlaf ...");
Schlaf (2000);
Fenster.Alert ("Nach dem Schlaf ...");
Unnötig zu erwähnen, nur IE -Unterstützung (IE7 kann sein Ziel aufgrund von Sicherheitsbeschränkungen nicht erreichen).
Darüber hinaus gibt es auch Tricks wie das Verwenden von Applet oder das Aufrufen von Windows -Skript -Hosts wscript.sleep (), die alle vorletzten Resorts sind.
Schließlich gibt es schlauer Leute, die vielleicht die beste Lösung entwickelt haben. Schauen wir uns zuerst den Code an:
Die Codekopie lautet wie folgt:
Funktion Schlaf (Millis) {
var notifier = njsRuntime.createTifier ();
setTimeout (Notifier, Millis);
Notifier.wait-> ();
}
Das ist richtig, die Syntax von -> () zu sehen, ist erstaunlich, dass die $ () -Funktion des Prototyps ist. Dieses Skript meldet jedoch Syntaxfehler direkt im Browser. Tatsächlich müssen sie in JavaScript, die vom Client -Browser genehmigt wurden, vorkompiliert werden. Das kompilierte Skript lautet wie folgt:
Die Codekopie lautet wie folgt:
Funktion Schlaf (Millis) {
var njf1 = njen (dies, Argumente, "Millis");
NJ: während (1) {
try {switch (njf1.cp) {
Fall 0: njf1._notifier = njsruntime.createNotifier ();
setTimeout (njf1._notifier, njf1._millis);
njf1.cp = 1;
njf1._notifier.wait (njf1);
zurückkehren;
Fall 1: NJ brechen;
}} catch (ex) {
if (! njf1.except (ex, 1))
zurückkehren;
}}
njf1.pf ();
}
Ich kann es nicht verstehen und ich möchte es nicht mehr verstehen. Alle diese Aufgaben werden durch narratives JavaScript implementiert - eine JS -Erweiterung, die uns asynchrone Blockierungsfunktionen bietet. Wir müssen nur die seltsame -> () Syntax schreiben und dann den Schlafeffekt durch vorstatische Zusammenstellung oder dynamische Zusammenstellung des Vordergrunds implementieren.
Narrative JavaScript behauptet, Sie von dizzigen Rückruffunktionen zu befreien und klare, lange, laufende Aufgaben zu schreiben. Derzeit ist es immer noch die Version von Alpha, und auf der Beispielseite gibt es ein Beispiel für eine Umzugsschaltfläche. Der Quellcode -Download ist auch auf der Homepage verfügbar. Mit meinem schwachen Grundwissen kann ich nur kaum erkennen, dass die Implementierung der Zustandsmaschine im Code simuliert wird. Ich hoffe, dass Freunde, die Algorithmen beherrschen, es für uns analysieren können.
Schließlich hatte ich immer meinen Standpunkt: Bitte halten Sie JavaScript einfach, es sei denn, dies ist notwendig. Bevor JavaScript native Unterstützung für Threads bieten kann, können wir das Design möglicherweise ändern, um asynchrone Blockierungsanwendungen zu vermeiden.
Eine gewundene Implementierung von Fehler
<Skriptyp "text/javaScript">/*Implementierung der Pause -Funktion in JavaScript JavaScript selbst hat keine Pause -Funktion (Schlaf kann nicht verwendet werden). Gleichzeitig kann VBSScript keine Doevents verwenden. Schreiben Sie also diese Funktion, um diese Funktion zu implementieren. JavaScript ist eine schwache Objektsprache, und eine Funktion kann auch als Objekt verwendet werden. Zum Beispiel: [Code] Funktionstest () {alert ("hellow"); this.NextStep = function () {alert ("NextStep"); }} Wir können var myTest = new Test () nennen; myTest.nextStep (); Wenn wir innehalten, kann eine Funktion in zwei Teile unterteilt werden, die unverändert vor dem Pausevorgang, und den Code nach der Pause in dieser Pause einlegen. Um die Pause und Fortsetzung zu kontrollieren, müssen wir zwei Funktionen schreiben, um Pause- und Fortsetzungsfunktionen zu implementieren. Die Pause -Funktion lautet wie folgt: */Funktion pause (obj, iMineSecond) {if (window.eventlist == null) window.eventlist = new Array (); var ind = -1; für (var i = 0; i <window.eventlist.length; i ++) {if (window.eventlist [i] = null) {window.eventlist [i] = obj; ind = i; brechen; }} if (ind ==-1) {ind = window.eventlist.length; window.eventlist [ind] = obj; } setTimeout ("goon (" + ind + ")", 1000);}/*Diese Funktion bringt die Funktion, die in das Array -Fenster pausiert werden soll. Die fortlaufende Funktion lautet wie folgt: */Funktion goon (ind) {var obj = window.eventlist [ind]; window.eventlist [ind] = null; if (obj.nextStep) obj.nextstep (); sonst obj ();}/*Diese Funktion ruft die nächste Startmethode der suspendierten Funktion auf. Wenn diese Methode nicht verfügbar ist, wird die Funktion erneut aufgerufen. Nachdem die Funktion geschrieben wurde, können wir das folgende Band schreiben: */Funktion test () {alert ("hellow"); Pause (this, 1000); // Aufruf der Pause -Funktion this.NextStep = function () {alert ("NextStep"); }} </script>