Gibt es einen Unterschied?
Ja. Ein Timeout wird eine bestimmte Zeit nach dem Aufruf von setTimeout() ausgeführt; ein Intervall wird eine bestimmte Zeit nach dem Auslösen des vorherigen Intervalls ausgeführt.
Sie werden den Unterschied bemerken, wenn Ihre doStuff()-Funktion eine Weile zur Ausführung braucht. Wenn wir zum Beispiel einen Aufruf von setTimeout/setInterval mit .
ein Auslösen des Timeouts/Intervalls mit *
und die Ausführung von JavaScript-Code mit [-----]
sehen die Zeitleisten wie folgt aus:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Die nächste Komplikation tritt auf, wenn ein Intervall ausgelöst wird, während JavaScript bereits mit einer anderen Aufgabe beschäftigt ist (z. B. mit der Bearbeitung eines vorherigen Intervalls). In diesem Fall wird das Intervall gespeichert und tritt ein, sobald der vorherige Handler beendet ist und die Kontrolle an den Browser zurückgibt. So zum Beispiel bei einem doStuff()-Prozess, der manchmal kurz ([-]) und manchmal lang ([-----]) ist:
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
- steht für einen Intervallbrand, der seinen Code nicht sofort ausführen konnte und stattdessen in die Schwebe gebracht wurde.
Die Intervalle versuchen also, den Rückstand aufzuholen, um den Zeitplan einzuhalten. Aber sie reihen sich nicht aneinander: Es kann immer nur eine Ausführung pro Intervall anstehen. (Würden sie sich alle in eine Warteschlange einreihen, hätte der Browser eine immer länger werdende Liste ausstehender Ausführungen).
. * • • x • • x
[------][------][------][------]
x steht für einen Intervallbrand, der nicht ausgeführt oder in die Schwebe gebracht werden konnte und daher verworfen wurde.
Wenn Ihre doStuff()-Funktion gewohnheitsmäßig länger für die Ausführung braucht als das für sie festgelegte Intervall, verbraucht der Browser 100 % der CPU, um sie zu bedienen, und ist möglicherweise weniger reaktionsschnell.
Welche verwenden Sie und warum?
Chained-Timeout gibt dem Browser ein garantiertes freies Zeitfenster; Interval versucht sicherzustellen, dass die ausgeführte Funktion so nah wie möglich an den geplanten Zeiten ausgeführt wird, was auf Kosten der Verfügbarkeit der Browser-Oberfläche geht.
Ich würde ein Intervall für einmalige Animationen in Betracht ziehen, die so reibungslos wie möglich ablaufen sollen, während verkettete Timeouts für laufende Animationen, die ständig ablaufen, während die Seite geladen wird, höflicher sind. Für weniger anspruchsvolle Anwendungen (wie z. B. ein trivialer Updater, der alle 30 Sekunden oder so etwas auslöst), können Sie beide sicher verwenden.
Was die Browserkompatibilität betrifft, so ist setTimeout älter als setInterval, aber alle Browser, die Sie heute kennen, unterstützen beide. Der letzte Nachzügler war viele Jahre lang der IE Mobile in WinMo <6.5, aber auch das liegt jetzt hoffentlich hinter uns.
6 Stimmen
Wenn Sie möchten einige gute Details, wie Timer in JS arbeiten, schrieb John Resig eine gute Artikel zu diesem Thema
9 Stimmen
Es gibt auch den offensichtlichen Unterschied, dass setTimeout diese zusätzliche Codezeile erfordert, um sie weiterzugeben, was den Nachteil hat, dass es ein Wartungsproblem ist, aber den Vorteil, dass Sie den Zeitraum leicht ändern können
0 Stimmen
Versuchen Sie dies jsfiddle.net/pramendra/Y4vEV
4 Stimmen
Danke @JapanPro, aber ich hatte noch nie ein Problem damit, dass Timeouts funktionieren. In diesem Beitrag ging es darum, was der Unterschied ist und was verwendet werden sollte.
0 Stimmen
Link aktualisieren. Die Bearbeitungswarteschlange ist voll setTimeout VS setIntervall