Fügen Sie eine Verzögerung nach der Ausführung jeder iteration mit forEach-Schleife
Gibt es eine einfache Möglichkeit, zu einer Verlangsamung der iteration in einer forEach (mit plain javascript)? Zum Beispiel:
var items = document.querySelector('.item');
items.forEach(function(el) {
//do stuff with el and pause before the next el;
});
- stackoverflow.com/questions/1447407/...
- Danke. Ich bin wirklich versucht, dies zu tun mit einfachen javascript. Ich bearbeitet meine Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie erreichen wollen, ist völlig möglich, mit
Array#forEach
— wenn auch in einem anderen, wie Sie vielleicht denken es ist. Sie können nicht tun, eine Sache wie diese:... und erhalten die Ausgabe:
Gibt es keine synchrone
wait
odersleep
Funktion in JavaScript, die blockiert alle code nach.Der einzige Weg, um die Verzögerung etwas in JavaScript wird in einer nicht blockierenden Weise. Das bedeutet, dass mit
setTimeout
oder einer seiner verwandten. Wir können den zweiten parameter der Funktion, die wir passieren, umArray#forEach
: es enthält den index des aktuellen Elements:JS:
Mithilfe der
index
können wir berechnen, wenn die Funktion ausgeführt werden soll. Aber jetzt haben wir ein anderes problem: dieconsole.log('Loop finished.')
ausgeführt wird vor der ersten iteration der Schleife. Das ist, weilsetTimout
ist nicht–blockierend.JavaScript setzt den Timeout in der Schleife, aber es muss nicht warten, bis die timeouts zu vervollständigen. Es wächst und ausführen von code nach der
forEach
.Umgehen, dass wir verwenden können
Promise
s. Wir bauen ein Versprechen Kette:JS:
Gibt es einen ausgezeichneten Artikel über
Promise
s in Verbindung mitforEach
/map
/filter
hier.Ich wird schwieriger, wenn das array dynamisch ändern können. In diesem Fall, ich glaube nicht, dass
Array#forEach
verwendet werden soll. Versuchen Sie, diese aus statt:JS:
HTML:
Müssen Sie machen Verwendung von setTimeout zum erstellen einer Verzögerung und haben eine rekursive Implementierung
Ihnen Beispiel Aussehen sollte
JS:
Zunächst müssen Sie den code ändern:
Lesen Sie mehr darüber hier
Kann ich rate Ihnen, Lesen Sie dieses Antwort finden eine passende Lösung für Schlaf
Können Sie
async/await
,Promise
KonstruktorsetTimeout()
undfor..of
Schleife, um Aufgaben in der Folge, wo einduration
festgelegt werden kann, bevor eine Aufgabe ausgeführt wirdJS:
//delay
,// do stuff
im code kann angepasst werden, um//do stuff
,// delay
Ich denke Rekursion ist die einfachste Lösung.
Generatoren
Dies gibt Ihnen vollständige Kontrolle über, wenn Sie wollen, um auf die nächste iteration in der Liste.