Gibt es eine bessere Möglichkeit, eine sleep
in JavaScript zu erstellen als die folgende pausecomp
Funktion ( von hier übernommen )?
function pausecomp(millis)
{
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < millis);
}
Dies ist kein Duplikat von Sleep in JavaScript - Verzögerung zwischen Aktionen ; Ich möchte einen echten Schlaf mitten in einer Funktion und keine Verzögerung, bevor ein Teil des Codes ausgeführt wird.
javascript
sleep
fmsf
quelle
quelle
Antworten:
Update 2017 - 2019
Seit 2009, als diese Frage gestellt wurde, hat sich JavaScript erheblich weiterentwickelt. Alle anderen Antworten sind jetzt veraltet oder zu kompliziert. Hier ist die aktuelle Best Practice:
Das ist es.
await sleep(<duration>)
.Oder als Einzeiler:
Beachten Sie, dass,
await
kann nur in Funktionen ausgeführt werden, denen dasasync
Schlüsselwort vorangestellt ist , oder in einigen Umgebungen (z. B. der Chrome DevTools-Konsole oder Runkit) auf der obersten Ebene Ihres Skripts.await
pausiert nur die aktuelleasync
FunktionZwei neue JavaScript-Funktionen haben beim Schreiben dieser "Schlaf" -Funktion geholfen:
async/await
Funktion kann der Code explizit auf die Erfüllung eines Versprechens warten (auflösen oder ablehnen).Kompatibilität
async
/await
landete in V8 und ist seit Chrome 55 (veröffentlicht im Dezember 2016) standardmäßig aktiviert.Wenn aus irgendeinem seltsamen Grund , den Sie verwenden Knoten älter als 7 (was erreicht hat Ende des Lebens ), oder alte Browser zielen,
async
/await
noch über verwendet werden Babel (ein Werkzeug , das wird transpile JavaScript + neue Funktionen in plain old JavaScript) mit demtransform-async-to-generator
Plugin.quelle
(Siehe die aktualisierte Antwort für 2016 )
Ich denke, es ist völlig vernünftig, eine Aktion ausführen zu wollen, zu warten und dann eine andere Aktion auszuführen. Wenn Sie es gewohnt sind, in Multithread-Sprachen zu schreiben, haben Sie wahrscheinlich die Idee, die Ausführung für einen festgelegten Zeitraum zu ermöglichen, bis Ihr Thread aufwacht.
Das Problem hierbei ist, dass JavaScript ein ereignisbasiertes Single-Thread-Modell ist. Während es in einem bestimmten Fall schön sein kann, den gesamten Motor einige Sekunden warten zu lassen, ist dies im Allgemeinen eine schlechte Praxis. Angenommen, ich wollte Ihre Funktionen nutzen, während ich meine eigenen schreibe? Wenn ich Ihre Methode aufrief, froren alle meine Methoden ein. Wenn JavaScript den Ausführungskontext Ihrer Funktion irgendwie beibehalten, irgendwo speichern, dann zurückbringen und später fortfahren könnte, könnte der Ruhezustand eintreten, aber das wäre im Grunde ein Threading.
Sie bleiben also ziemlich bei dem, was andere vorgeschlagen haben - Sie müssen Ihren Code in mehrere Funktionen aufteilen.
Ihre Frage ist also eine falsche Wahl. Es gibt keine Möglichkeit, so zu schlafen, wie Sie es möchten, und Sie sollten auch nicht die von Ihnen vorgeschlagene Lösung verfolgen.
quelle
sleep()
dies in JS nicht möglich ist und dass es die meiste Zeit bessere Möglichkeiten gibt, Dinge zu tun. Aber ich würde immer noch die Art und Weise, wie der Motor alle Dinge zusammenhält, als Konstruktionsfehler betrachten. Es gibt keinen Grund, warum die Sprache keinesleep()
Funktion haben könnte, die auf ein bestimmtes Skript, eine bestimmte Seite oder eine bestimmte Funktion beschränkt ist, ohne dass die Engine die CPU überlastet und die App wie ein Verrückter einfriert. Es ist 2015 und Sie sollten nicht in der Lage sein, einen ganzen Webbrowser mit zum Absturz zu bringenwhile(1)
. Wir haben Flash für solche Dinge.In JavaScript schreibe ich jede Funktion neu, damit sie so schnell wie möglich beendet werden kann. Sie möchten, dass der Browser wieder die Kontrolle hat, damit er Ihre DOM-Änderungen vornehmen kann.
Jedes Mal, wenn ich mitten in meiner Funktion schlafen wollte, überarbeitete ich die Verwendung von a
setTimeout()
.Bearbeiten
Die berüchtigte Schlaf- oder Verzögerungsfunktion in jeder Sprache wird viel diskutiert. Einige werden sagen, dass es immer ein Signal oder einen Rückruf geben sollte, um eine bestimmte Funktionalität auszulösen, andere werden argumentieren, dass manchmal ein beliebiger Moment der Verzögerung nützlich ist. Ich sage, dass jeder seine eigene und eine Regel niemals etwas in dieser Branche diktieren kann.
Das Schreiben einer Schlaffunktion ist einfach und mit JavaScript Promises noch benutzerfreundlicher:
quelle
function foobar(el) { setTimeout(function() { foobar_cont(el); }, 5000); }
Nur für Debug / Dev poste ich dies, wenn es für jemanden nützlich ist
Interessantes, in Firebug (und wahrscheinlich auch in anderen js-Konsolen) passiert nichts, nachdem Sie die Eingabetaste gedrückt haben, nur nach der angegebenen Schlafdauer (...)
Anwendungsbeispiel:
quelle
only for debug/dev
... rolleyesIch stimme den anderen Postern zu, ein geschäftiger Schlaf ist nur eine schlechte Idee.
SetTimeout verzögert jedoch nicht die Ausführung, sondern führt die nächste Zeile der Funktion unmittelbar nach dem Einstellen des Timeouts aus, nicht nach Ablauf des Timeouts, sodass nicht dieselbe Aufgabe ausgeführt wird, die ein Sleep ausführen würde.
Der Weg, dies zu tun, besteht darin, Ihre Funktion in vor und nach Teilen aufzuteilen.
Stellen Sie sicher, dass Ihre Funktionsnamen immer noch genau beschreiben, was jedes Teil tut (IE GatherInputThenWait und CheckInput anstelle von funcPart1 und funcPart2).
Bearbeiten
Mit dieser Methode wird der Zweck erreicht, die von Ihnen festgelegten Codezeilen erst nach Ablauf Ihrer Zeitüberschreitung auszuführen, während die Steuerung weiterhin an den Client-PC zurückgegeben wird, um alle anderen Warteschlangen auszuführen.
Weitere Bearbeitung
Wie in den Kommentaren erwähnt, wird dies absolut NICHT in einer Schleife funktionieren. Sie könnten ein ausgefallenes (hässliches) Hacking durchführen, damit es in einer Schleife funktioniert, aber im Allgemeinen führt dies nur zu katastrophalem Spaghetti-Code.
quelle
function foo(index) { setTimeout(function() { foo_continue(index); }, 10000); }
undfor(var X = 0; X < 3;X++) { foo(X); }
- der Wert von X wird übergebenfoo
, der dann unter dem Namen wiederverwendet wird,index
wenn erfoo_continue
schließlich aufgerufen wird.console.log()
Innerefoo_continue()
in die setTimeout-Version einfügen, erhalten Sie das gleiche Ergebnis.Aus Liebe zu $ DEITY machen Sie bitte keine Funktion zum Warten auf viel zu tun.
setTimeout
undsetInterval
mach alles was du brauchst.Alle zwei Sekunden wird der Text eine Sekunde lang ausgeblendet. Dies zeigt, wie Sie mit setInterval und setTimeout jede Sekunde Text ein- und ausblenden.
quelle
Ich weiß, dass dies eine alte Frage ist, aber wenn Sie (wie ich) Javascript mit Rhino verwenden, können Sie ...
quelle
Wenn Sie jQuery verwenden, hat jemand tatsächlich ein "Delay" -Plugin erstellt, das nichts weiter als ein Wrapper für setTimeout ist:
Sie können es dann wie erwartet in einer Reihe von Funktionsaufrufen verwenden:
quelle
.delay()
ist es Teil von jQuery (allerdings mit einer anderen Semantik als der obigen Implementierung). api.jquery.com/delayIch habe auch nach Schlaflösung gesucht (nicht nach Produktionscode, nur nach Entwicklern / Tests) und diesen Artikel gefunden:
http://narayanraman.blogspot.com/2005/12/javascript-sleep-or-wait.html
... und hier ist ein weiterer Link zu clientseitigen Lösungen: http://www.devcheater.com/
Wenn Sie anrufen
alert()
, wird auch Ihr Code angehalten, während die Warnung angezeigt wird. Sie müssen einen Weg finden, um die Warnung nicht anzuzeigen, aber den gleichen Effekt zu erzielen. :) :)quelle
Hier ist eine einfache Lösung mit einem synchronen XMLHttpRequest:
Inhalt von sleep.php:
Nennen Sie es jetzt mit: sleep (5);
quelle
setTimeout()
diese Option, wenn dies funktioniert. Wenn dies jedoch bedeutet, dass 1000 Rückrufzeilen aufgelöst werden, sieht dies möglicherweise nicht wie ein Witz aus.sleep(300)
Website verwenden und die Antwort 150 ms dauert, wird der Javascript-Code 450 ms lang in den Ruhezustand versetzt. und wenn die Internetverbindung durch den Browser unterbrochen wird, funktioniert sie nur für 0 ms. Es ist also keine bessere LösungBitte schön. Wie der Code sagt, sei kein schlechter Entwickler und benutze dies auf Websites. Es ist eine Entwicklungsdienstprogrammfunktion.
quelle
async/await
sie leider nicht und wir müssen sie obligatorisch verwenden.Ich persönlich mag das einfache:
dann:
Ich benutze es die ganze Zeit, um falsche Ladezeiten zu erstellen, während ich Skripte in P5js erstelle
quelle
Zuerst:
Definieren Sie eine Funktion, die Sie wie folgt ausführen möchten:
Planen Sie dann die Ausführung mit der setTimeout-Methode:
Beachten Sie zwei Dinge
quelle
Stellen Sie sicher, dass Ihre aufrufende Funktion asynchron ist
verifiziert und funktioniert gut
quelle
Eine bessere Lösung, um die Dinge so aussehen zu lassen, wie es die meisten Menschen wollen, ist die Verwendung einer anonymen Funktion:
Dies ist wahrscheinlich der nächste Schritt zu etwas, das einfach das tut, was Sie wollen.
Hinweis: Wenn Sie mehrere Schlafplätze benötigen, kann dies in Eile hässlich werden und Sie müssen möglicherweise Ihr Design überdenken.
quelle
Für Browser stimme ich zu, dass setTimeout und setInterval der richtige Weg sind.
Für serverseitigen Code ist möglicherweise eine Blockierungsfunktion erforderlich (z. B. um eine effektive Thread-Synchronisierung durchzuführen).
Wenn Sie node.js und meteor verwenden, sind Sie möglicherweise auf die Einschränkungen bei der Verwendung von setTimeout in einer Glasfaser gestoßen. Hier ist der Code für den serverseitigen Ruhezustand.
Siehe: https://github.com/laverdet/node-fibers#sleep
quelle
Server may require a blocking function
... Ich verstehe nicht, wie stark es ist, den einzigen Thread von Node zu blockieren und Ihren gesamten Server für einige Sekunden nicht mehr zu reagieren, aber was auch immerIch würde setTimeOut in ein Versprechen für Codekonsistenz mit anderen asynchronen Aufgaben einkapseln: Demo in Fiddle
So verwendet:
Es ist leicht, sich die Syntax zu merken, wenn Sie Promises verwendet haben.
quelle
2019 Update mit Atomics.wait
Sollte in Knoten 9.3 oder höher funktionieren.
Ich brauchte einen ziemlich genauen Timer in Node.js und es funktioniert großartig dafür. Es scheint jedoch, dass die Unterstützung in Browsern äußerst begrenzt ist.
Lief ein paar 10-Sekunden-Timer-Benchmarks.
Mit setTimeout erhalte ich einen Fehler von bis zu 7000 Mikrosekunden. (7 ms)
Mit Atomics scheint mein Fehler unter 600 Mikrosekunden zu bleiben. (0,6 ms)
Update 2020: Zusammenfassend
davon
sleep.jsp
sieht die serverseitige Seite zB ausquelle
Die meisten Antworten hier sind falsch oder zumindest veraltet. Es gibt keinen Grund, warum Javascript Single-Threaded sein muss, und das ist es auch nicht. Heute unterstützen alle gängigen Browser Worker, bevor dies der Fall war, unterstützten andere Javascript-Laufzeiten wie Rhino und Node.js Multithreading.
'Javascript is single threaded' ist keine gültige Antwort. Wenn Sie beispielsweise eine Sleep-Funktion in einem Worker ausführen, wird der im UI-Thread ausgeführte Code nicht blockiert.
In neueren Laufzeiten, die Generatoren und Ertrag unterstützen, könnte man der Sleep-Funktion in einer Umgebung mit einem Thread ähnliche Funktionen hinzufügen:
Diese Nachahmung des Schlafes unterscheidet sich von einer echten Schlaffunktion, da sie den Thread nicht blockiert. Es ist einfach Zucker zusätzlich zu der aktuellen setTimeout-Funktion von Javascript. Dieser Funktionstyp wurde in Task.js implementiert und sollte heute in Firefox funktionieren.
quelle
sleep
mit mehreren Workern zu implementieren . Bei Verwendung von Node.js sind Generatorfunktionen bereits implementiert und können wie beschrieben verwendet werden. Mainstream-Browser haben bis heute nicht alle Generatoren implementiert.Ich habe einige Webseiten über Javascript Sleep / Wait durchsucht / gegoogelt ... und es gibt KEINE Antwort, wenn Sie möchten, dass Javascript "RUN, DELAY, RUN" ist ... was die meisten Leute auch bekamen, war "RUN, RUN" (nutzlos) Zeug), RUN "oder" RUN, RUN + verzögert RUN "....
Also habe ich ein paar Burger gegessen und mir Gedanken gemacht ::: Hier ist eine Lösung, die funktioniert ... aber du musst deine laufenden Codes zerhacken ... ::: Ja, ich weiß, das ist nur ein einfacher zu lesendes Refactoring. . immer noch...
//......................................... //Beispiel 1:
// .................................... // Beispiel2:
// ................. Beispiel3:
// .............. Beispiel4:
quelle
quelle
Die kürzeste Lösung ohne Abhängigkeiten:
quelle
await new Promise(function(resolve) { setTimeout(resolve, 5000); });
In JavaScript kann man so nicht schlafen, oder eher nicht. Wenn Sie eine Schlaf- oder eine while-Schleife ausführen, bleibt der Browser des Benutzers hängen, bis die Schleife abgeschlossen ist.
Verwenden Sie einen Timer, wie in dem Link angegeben, auf den Sie verwiesen haben.
quelle
Ein Szenario, in dem Sie möglicherweise eine sleep () - Funktion anstelle von setTimeout () wünschen, besteht darin, dass Sie eine Funktion haben, die auf einen Benutzerklick reagiert und letztendlich ein neues Popup-Fenster öffnet, und dass Sie eine Verarbeitung eingeleitet haben, die einen kurzen Zeitraum erfordert zu vervollständigen, bevor das Popup angezeigt wird. Wenn Sie das geöffnete Fenster in einen geschlossenen Zustand verschieben, wird es normalerweise vom Browser blockiert.
quelle
Ich kann den Zweck einer Schlaffunktion verstehen, wenn Sie sich mit synchroner Ausführung befassen müssen. Die Funktionen setInterval und setTimeout erstellen einen parallelen Ausführungsthread, der die Ausführungssequenz an das Hauptprogramm zurückgibt. Dies ist unwirksam, wenn Sie auf ein bestimmtes Ergebnis warten müssen. Natürlich kann man Ereignisse und Handler verwenden, aber in einigen Fällen ist dies nicht beabsichtigt.
quelle
Meine zwei Bits hinzufügen. Ich musste zu Testzwecken warten. Ich wollte den Code nicht aufteilen, da dies eine Menge Arbeit bedeuten würde.
Ich sehe keinen Nachteil darin und es hat den Trick für mich getan.
quelle
for
Schleifen wird fast immer sofort ausgeführt, unabhängig vom Maximalwert füri
und sogar mit komplexem mathematischem Code. Wenn Sie also nicht nur ein paar Millisekunden warten, scheint es in JS immer noch keine Möglichkeit zu geben, elegant zu schlafen.Dies kann mit der Schlafmethode von Java erfolgen. Ich habe es in FF und IE getestet und es sperrt den Computer nicht, zerkaut keine Ressourcen und verursacht keine endlosen Server-Treffer. Scheint mir eine saubere Lösung zu sein.
Zuerst müssen Sie Java auf die Seite laden und seine Methoden verfügbar machen. Um das zu tun, habe ich Folgendes getan:
Dann müssen Sie nur noch Folgendes tun, wenn Sie eine schmerzlose Pause in Ihrem JS wünschen:
Wobei xxx die Zeit in Millisekunden ist. In meinem Fall (zur Rechtfertigung) war dies Teil der Erfüllung von Back-End-Bestellungen in einem sehr kleinen Unternehmen, und ich musste eine Rechnung drucken, die vom Server geladen werden musste. Dazu habe ich die Rechnung (als Webseite) in einen iFrame geladen und dann den iFrame gedruckt. Natürlich musste ich warten, bis die Seite vollständig geladen war, bevor ich drucken konnte, also musste der JS pausieren. Dies wurde erreicht, indem die Rechnungsseite (im iFrame) mit dem Ereignis onLoad ein ausgeblendetes Formularfeld auf der übergeordneten Seite änderte. Und der Code auf der übergeordneten Seite zum Drucken der Rechnung sah folgendermaßen aus (irrelevante Teile aus Gründen der Übersichtlichkeit):
Der Benutzer drückt also die Taste, das Skript lädt die Rechnungsseite, wartet, überprüft jede Viertelsekunde, ob die Rechnungsseite vollständig geladen ist, und öffnet dann den Druckdialog, damit der Benutzer sie an den Drucker senden kann. QED.
quelle
Viele der Antworten beantworten die Frage nicht (direkt) und diese auch nicht ...
Hier sind meine zwei Cent (oder Funktionen):
Wenn Sie weniger klobige Funktionen als
setTimeout
und möchtensetInterval
, können Sie sie in Funktionen einschließen, die nur die Reihenfolge der Argumente umkehren und ihnen nette Namen geben:CoffeeScript-Versionen:
Sie können sie dann mit anonymen Funktionen gut verwenden:
Jetzt liest es sich leicht als "nach N Millisekunden, ..." (oder "alle N Millisekunden, ...")
quelle
Für den speziellen Fall, dass eine Reihe von Aufrufen, die von einer Schleife ausgeführt werden, entfernt werden sollen, können Sie mit dem Prototyp den folgenden Code verwenden. Ohne Prototyp können Sie die Verzögerungsfunktion durch setTimeout ersetzen.
quelle
Wenn Sie sich auf node.js befinden, können Sie sich die Fasern ansehen - eine native C-Erweiterung für Node, eine Art Multithreading-Simulation.
Es ermöglicht Ihnen, eine echte zu tun
sleep
auf eine Weise zu erstellen, die die Ausführung in einer Faser blockiert, aber im Hauptfaden und anderen Fasern nicht blockiert.Hier ist ein Beispiel, das frisch aus ihrer eigenen Readme stammt:
- und die Ergebnisse sind:
quelle