Gibt es eine Möglichkeit, in JavaScript zu schlafen, bevor eine weitere Aktion ausgeführt wird?
Beispiel:
var a = 1+3;
// Sleep 3 seconds before the next action here
var b = a + 4;
javascript
sleep
Jin Yong
quelle
quelle
Für den Fall, dass Sie wirklich nur brauchen
sleep()
, um etwas zu testen. Beachten Sie jedoch, dass der Browser beim Debuggen meistens abstürzt - wahrscheinlich benötigen Sie ihn deshalb trotzdem. Im Produktionsmodus werde ich diese Funktion auskommentieren.Nicht benutzen
new Date()
in der Schleife verwenden, es sei denn, Sie möchten Speicher, Rechenleistung, Akku und möglicherweise die Lebensdauer Ihres Geräts verschwenden.quelle
ECMAScript 6-Version mit Generatoren mit Ausbeute für "Codeblocking":
Da die ursprüngliche Frage vor sieben Jahren gestellt wurde, habe ich mich nicht darum gekümmert, mit dem genauen Code zu antworten, da dies einfach zu einfach und bereits beantwortet ist. Dies sollte bei komplizierteren Problemen helfen, z. B. wenn Sie mindestens zwei Schlafphasen benötigen oder wenn Sie planen, die asynchrone Ausführung zu sequenzieren. Sie können es jederzeit an Ihre Bedürfnisse anpassen.
Funktion*
() => Pfeilfunktion
Sie können Ereignisse auch über Versprechen verketten :
Oder viel einfacher und weniger ausgefallen wäre
Wenn Sie nur darauf warten, dass eine Bedingung eintritt, können Sie so warten
quelle
Update 2018
Die neuesten Versionen von Safari, Firefox und Node.j unterstützen jetzt auch asynchrone / warten / versprechen.
Verwenden von async / await / Promises:
(Ab 1/2017, unterstützt von Chrome, jedoch nicht von Safari, Internet Explorer, Firefox, Node.js)
Update 2017
JavaScript hat sich weiterentwickelt, seit diese Frage gestellt wurde, und verfügt nun über Generatorfunktionen. Das neue Programm async / await / Promise wird eingeführt.
Im Folgenden finden Sie zwei Lösungen, eine mit Generatorfunktion, die auf allen modernen Browsern funktioniert, und eine andere mit dem neuen Async / Warten, das noch nicht überall unterstützt wird.Verwenden einer Generatorfunktion:
Beachten Sie, dass beide Lösungen asynchroner Natur sind. Dies bedeutet, dass myAsyncFunc (in beiden Fällen) im Schlaf zurückkehrt.
Es ist wichtig zu beachten, dass sich diese Frage von der JavaScript-Version von sleep () unterscheidet. wo der Anforderer eher nach echtem Schlaf fragt (keine andere Codeausführung im Prozess) als nach einer Verzögerung zwischen den Aktionen.
quelle
let co = gen => (...args) => { let iter = gen(...args); let resume = () => new Promise((resolve, reject) => { let result = iter.next(); if (result.done) resolve(result.value); else Promise.resolve(result.value).then(resume).then(resolve, reject); }); return resume(); };
Sielet asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);
können die Definition vonsleep()
aus Ihrem zweiten Codeblock verwenden.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 gut mit anonymen Funktionen verwenden:
Jetzt liest es sich leicht als "nach N Millisekunden, ..." (oder "alle N Millisekunden, ...")
quelle
Eine andere Möglichkeit besteht darin, Promise und setTimeout zu verwenden (beachten Sie, dass Sie sich in einer Funktion befinden und diese mit dem Schlüsselwort async als asynchron festlegen müssen):
quelle
Hier ist eine sehr einfache Möglichkeit, die sich wie ein synchroner Schlaf / eine synchrone Pause anfühlt, aber legitimer asynchroner Code ist.
quelle
Sie können einfaches Javascript verwenden. Dies ruft Ihre Funktion / Methode nach 5 Sekunden auf:
quelle
Es gibt verschiedene Möglichkeiten, um dieses Problem zu lösen. Wenn wir die
setTimeout
Funktion verwenden, lernen wir sie zuerst kennen. Diese Funktion hat drei Parameter:function
odercode
,delay
(in Millisekunden) und dieparameters
. Da die Funktion oder Code - Parameter erforderlich ist, sind die anderen. Sobald Sie die Verzögerung nicht eingegeben haben , wird sie auf Null gesetzt.Weitere Details
setTimeout()
dazu finden Sie unter diesem Link .Vereinfachte Version:
Verwenden des Parameterpasses:
Browser-Unterstützung:
quelle
Dies ist mein Modell, das zeigt, wie man mit einer Generatorfunktion (ES6) in Javascript "schläft" oder "DoEvents" macht. Kommentierter Code:
quelle
Versuchen Sie diese Funktion:
So verwenden Sie es:
Oder versprechen Sie Stil:
Hier ist eine Demo .
quelle