Ich möchte eine Verzögerung / Schlaf in einem hinzufügen while
Schleife :
Ich habe es so versucht:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Nur das erste Szenario ist wahr: Nach dem Anzeigen wird es alert('hi')
3 Sekunden warten, dann alert('hello')
wird es angezeigt, aber dann alert('hello')
wird es ständig wiederholt.
Was ich möchte ist, dass nach alert('hello')
3 Sekunden angezeigt wird, alert('hi')
dann muss es zum zweiten Mal 3 Sekunden warten alert('hello')
und so weiter.
quelle
for in
Schleife iteriert wird?Object.keys()
setTimeout
mitsetInterval
. Zeitüberschreitungen werden implizit zerstört, wenn der Rückruf aufgerufen wird.Versuchen Sie so etwas:
quelle
Wenn Sie ES6 verwenden, können Sie Folgendes verwenden
let
:Was
let
bedeutet, isti
für jede Iteration zu deklarieren , nicht für die Schleife. Auf diese WeisesetTimeout
wird genau das weitergegeben, was wir wollen.quelle
i*3000
Arguments innerhalb der Schleife und übergibt ihn alssetTimeout
Wert an. Die Verwendung vonlet
ist optional und steht in keinem Zusammenhang mit der Frage und Antwort.i < 10
) endet, sodass mehrere Timer parallel arbeiten, wodurch eine Speicherzuordnung erstellt wird, und dies ist bei einer größeren Anzahl von Iterationen schlechter.Seit ES7 gibt es einen besseren Weg zu auf eine Schleife warten :
Wenn der Motor das
await
Teil erreicht, setzt er eine Zeitüberschreitung und stoppt die Ausführung desasync function
. Wenn das Zeitlimit abgelaufen ist, wird die Ausführung an diesem Punkt fortgesetzt. Dies ist sehr nützlich, da Sie (1) verschachtelte Schleifen, (2) bedingt, (3) verschachtelte Funktionen verzögern können:Referenz zu MDN
Während ES7 jetzt von NodeJS und modernen Browsern unterstützt wird, möchten Sie es möglicherweise mit BabelJS transpilieren, damit es überall ausgeführt wird.
quelle
break;
vielleicht?Eine andere Möglichkeit besteht darin, die Zeit bis zum Timeout zu multiplizieren. Beachten Sie jedoch, dass dies nicht wie Schlaf ist . Code nach der Schleife wird sofort ausgeführt, nur die Ausführung der Rückruffunktion wird verschoben.
Das erste Timeout wird auf gesetzt
3000 * 1
, das zweite auf3000 * 2
und so weiter.quelle
start
diese Methode mit dieser Methode nicht zuverlässig in Ihrer Funktion verwenden können.Das wird funktionieren
Versuchen Sie diese Geige: https://jsfiddle.net/wgdx8zqq/
quelle
$.Deferred
aber es war ein anderes Szenario, um es funktionieren zu lassen, Daumen zu dir ..!Ich denke du brauchst so etwas:
Testcode:
Hinweis: Die Verwendung von Warnungen blockiert die Ausführung von Javascript, bis Sie die Warnung schließen. Es ist möglicherweise mehr Code, als Sie angefordert haben, aber dies ist eine robuste wiederverwendbare Lösung.
quelle
Ich würde wahrscheinlich verwenden
setInteval
. So was,quelle
SetInterval()
selbst im Falle eines Fehlers oder Blocks immer wieder "Threads" entstehen.In ES6 (ECMAScript 2015) können Sie mit Generator und Intervall verzögert iterieren .
Codebeispiel:
Wenn Sie also ES6 verwenden, ist dies der eleganteste Weg, um eine Schleife mit Verzögerung zu erreichen (meiner Meinung nach).
quelle
Sie können den RxJS- Intervalloperator verwenden . Das Intervall gibt alle x Sekunden eine Ganzzahl aus, und take gibt an, wie oft Zahlen ausgegeben werden müssen
quelle
Ich dachte nur, ich würde meine zwei Cent auch hier posten. Diese Funktion führt eine iterative Schleife mit einer Verzögerung aus. Siehe diese jsfiddle . Die Funktion ist wie folgt:
Zum Beispiel:
Wäre gleichbedeutend mit:
quelle
Ich mache das mit Bluebird's
Promise.delay
und Rekursion.quelle
In ES6 können Sie Folgendes tun:
In ES5 können Sie Folgendes tun:
Der Grund dafür ist,
let
dass Sie Variablen deklarieren können, die auf einen Bereich einer Blockanweisung oder einen Ausdruck beschränkt sind, für den sie verwendet werden, im Gegensatz zumvar
Schlüsselwort, das eine Variable global oder lokal für eine gesamte Funktion definiert, unabhängig vom Blockbereich.quelle
Code-Snippet anzeigen
Eine modifizierte Version von Daniel Vassallos Antwort mit Variablen, die in Parameter extrahiert wurden, um die Funktion wiederverwendbarer zu machen:
Definieren wir zunächst einige wesentliche Variablen:
Als nächstes sollten Sie die Funktion definieren, die Sie ausführen möchten. Dies wird i, der aktuelle Index der Schleife und die Länge der Schleife übergeben, falls Sie es brauchen:
Selbstausführende Version
Funktionsversion
quelle
quelle
Mach du es:
quelle
quelle
So habe ich eine Endlosschleife mit einer Verzögerung erstellt, die unter bestimmten Bedingungen unterbrochen wird:
Der Schlüssel hier ist, ein neues Versprechen zu erstellen, das nach Zeitüberschreitung aufgelöst wird, und auf seine Lösung zu warten.
Natürlich brauchen Sie dafür asynchrone Unterstützung. Funktioniert in Knoten 8.
quelle
für den allgemeinen Gebrauch "vergiss normale Schleifen" und benutze diese Kombination von "setInterval" beinhaltet "setTimeOut" s: so (von meinen eigentlichen Aufgaben).
PS: Verstehe, dass das wirkliche Verhalten von (setTimeOut): Sie werden alle zur gleichen Zeit starten. "Die drei bla bla bla werden im selben Moment herunterzählen."
PS 2: Das Beispiel für eine Zeitschleife, aber für eine Reaktionsschleife können Sie Ereignisse verwenden, versprechen asynchrones Warten.
quelle
quelle
Meines Wissens wird die
setTimeout
Funktion asynchron aufgerufen. Sie können die gesamte Schleife in eine asynchrone FunktionPromise
einschließen und auf eine warten , die das setTimeout wie folgt enthält:Und dann rufst du es so an:
Bitte nehmen Sie sich etwas Zeit, um ein gutes Verständnis der asynchronen Programmierung zu erlangen.
quelle
Probieren Sie es einfach aus
Ergebnis
quelle
Hier ist eine Funktion, die ich zum Durchlaufen eines Arrays verwende:
Sie verwenden es so:
quelle
Dieses Skript funktioniert für die meisten Dinge
quelle
Versuche dies...
quelle
Einfache Implementierung, bei der alle zwei Sekunden ein Textstück angezeigt wird, solange die Schleife ausgeführt wird.
quelle
Versuche dies
quelle