setTimeout und jedes array
Ich bin verwirrt mit der Verwendung von setTimeout und jeden iterator. Wie kann ich schreiben Sie die folgenden, so dass die Konsole Ausgänge jedem Namen nach einer Verzögerung von 5 Sekunden? Derzeit ist der folgende code druckt alle Namen auf einmal nach 5 Sekunden. Ich möchte:
1) warten Sie 5 Sekunden, und drucken Sie dann kevin
2) warten Sie 5 Sekunden, und drucken Sie dann mike
3) warten Sie 5 Sekunden, dann drucken sally
var ary = ['kevin', 'mike', 'sally'];
_(ary).each(function(person){
setTimeout(function(){
console.log(person);
}, 5000);
});
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man erstellen Sie eine variable namens
offset
macht der timer warten Sie 5 Sekunden mehr für jede person im array, etwa so:each
läuft drei mal, und jedes mal, wennoffset
bekommt 5000 größer, so dass das timeout für jede nachfolgende person ist 5 Sekunden später.Haben Sie drei grundlegende Optionen:
setTimeout
... initialisieren jeder sofort, aber Staffeln Sie die Startzeiten auf der Basis der index-position, damit Sie nicht alle gehen zur gleichen Zeit.
setTimeout
+ bedingte Rekursion... schauen Sie in jedem n Sekunden - und ich werde Ihnen sagen, wenn Sie eine weitere
setInterval
+ bedingteclearInterval
... läuft weiter jeden n Sekunden, bis ich Ihnen sagen, zu stoppen
Hier ist jeder einzelne von denen ausgearbeitet wird, mit einem Beispiel arbeiten:
1. Für Schleife +
setTimeout
Ein paar Hinweise auf diesen einen. Das ist so etwas wie der Beginn ein Staffellauf und die übergabe von Anweisungen vor der Zeit, um jeden Läufer starten bei exakt 5:00 und 5:02 und 5:04, unabhängig davon, ob die person hinter Ihnen fertig vor langer Zeit oder noch nicht angekommen.
Können, können Sie auch nicht mit einem regulären
for i=0 loop
, weil das für die Betreiber nicht definieren neue Funktion Rahmen. Somit Objekt festgelegten Werte innerhalb der einzelnen for-Schleife gilt in Iterationen. Durch die Zeit setTimeout aufgerufen wird, wird nur der aktuellste Wert. Wir brauchen also einen Verschluss um den Wert zu speichern in jeder Schleife. Ich habeArray.der Prototyp.forEach()
, aber wenn Sie wollen, verwenden Sie die forEach-Implementierungen in jQuery oder Unterstreichen, dann klappt das auch.JS:
2.
setTimeout
+ bedingte RekursionFür die unteren beiden Optionen, wir machen unsere eigenen loops, also müssen wir verfolgen den index selbst, der Initialisierung auf null und Inkrementieren der gesamten.
Für diese ein, wir werden eine) call
setTimeout
, die einmal ausgeführt, b) bewerten Sie das array an der Indexposition c) prüfen, ob es weitere Elemente im array und wenn ja, beginnen Sie wieder bei a).JS:
3.
setInterval
+ bedingteclearInterval
HINWEIS: Die Funktion
setInterval
laufen immer einmal genannt. Es ist return-Wert, wenn Sie zunächst wird eine Referenz auf das Intervall, so ist es oft kombiniert mit der FunktionclearInterval
Optional schalten Sie es nach unten die StraßeJS:
3* Geheime Vierte Option (Beste)
Optionen 1 & 2 sind riskant, denn sobald man sich auf den Weg, die Bahn, es gibt keine Möglichkeit, es zu nennen die Straße hinab (speichern, schließen des Browsers). Wenn man ein großes array oder eine schwere Last in Ihrem delegieren, es wäre schön, einige Rückgriff, wenn Sie es brauchen. Durch speichern der Referenz von
setInterval
wir haben ständigen Zugriff auf die iterierende Funktion. Wir müssen einfach nur zurück die Intervall-Objekt oben und speichern Sie es, wenn Sie unser array plus delay-Funktion.JS:
Dann, wenn wir jemals wollen, um es klar später auf, werfen diese in die Konsole ein:
Alle 3 Demos in jsFiddle
Ähnlich Wie Stack Overflow Fragen:
Könnten Sie tun,
Ohne Erhöhung der
timeout
Wert, würden Sie initialisiert allesetTimeouts
mit den exakt gleichen Wert (das ist, warum Sie sehen, was Sie sehen).each
ist in der Regel besser für die Dinge, die passieren, sofort.Statt, wenn Sie don ' T mind ändern der array, können Sie es verwenden, wie eine Warteschlange:
Er hält an der Berufung
loop
5 Sekunden in die Zukunft, bis es nichts mehr in der Warteschlange.Könnte man nur verwenden, setInterval() mit einem einfachen zu erhöhen-durch-einen Zähler.
Aber beachten Sie, dass das starten werfen Fehler, nachdem ich größer als zwei. Sie müssen irgendeine Art von Validierung und vergewissern Sie sich, löschen Sie das Intervall.
setInterval
RückrufclearInterval
wenn der array ist leer.