Gibt es einen Unterschied?
Ja. Ein Timeout führt eine bestimmte Zeitspanne aus, nachdem setTimeout () aufgerufen wurde. Ein Intervall wird eine bestimmte Zeitspanne nach dem Auslösen des vorherigen Intervalls ausgeführt.
Sie werden den Unterschied bemerken, wenn die Ausführung Ihrer doStuff () -Funktion eine Weile dauert. Wenn wir beispielsweise einen Aufruf von setTimeout / setInterval mit .
, ein Auslösen des Timeouts / Intervalls mit *
und die Ausführung von JavaScript-Code mit darstellen [-----]
, sehen die Zeitleisten wie folgt aus:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Die nächste Komplikation besteht darin, dass ein Intervall ausgelöst wird, während JavaScript bereits beschäftigt ist (z. B. die Behandlung eines vorherigen Intervalls). In diesem Fall wird das Intervall gespeichert und erfolgt, sobald der vorherige Handler beendet ist und die Steuerung an den Browser zurückgibt. So zum Beispiel für einen doStuff () -Prozess, der manchmal kurz ([-]) und manchmal lang ([-----]) ist:
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• stellt ein Intervallfeuer dar, das seinen Code nicht sofort ausführen konnte und stattdessen ausstehend gemacht wurde.
Intervalle versuchen also, aufzuholen, um wieder im Zeitplan zu sein. Sie stellen jedoch keine übereinander in die Warteschlange: Pro Intervall kann immer nur eine Ausführung anstehen. (Wenn sie alle in der Warteschlange stehen würden, würde der Browser eine ständig wachsende Liste ausstehender Ausführungen haben!)
. * • • x • • x
[------][------][------][------]
x steht für ein Intervallfeuer, das nicht ausgeführt oder ausstehend gemacht werden konnte und stattdessen verworfen wurde.
Wenn die Ausführung Ihrer doStuff () -Funktion gewöhnlich länger dauert als das dafür festgelegte Intervall, verbraucht der Browser 100% der CPU, die versucht, sie zu warten, und reagiert möglicherweise weniger schnell.
Welches benutzt du und warum?
Chained-Timeout bietet dem Browser eine garantierte freie Zeit. Intervall versucht sicherzustellen, dass die von ihm ausgeführte Funktion auf Kosten der Verfügbarkeit der Browser-Benutzeroberfläche so nahe wie möglich an den geplanten Zeiten ausgeführt wird.
Ich würde ein Intervall für einmalige Animationen in Betracht ziehen, das ich so flüssig wie möglich gestalten wollte, während verkettete Zeitüberschreitungen für laufende Animationen, die während des Ladens der Seite ständig stattfinden, höflicher sind. Für weniger anspruchsvolle Anwendungen (z. B. ein trivialer Updater, der alle 30 Sekunden ausgelöst wird oder so), können Sie beide sicher verwenden.
In Bezug auf die Browserkompatibilität ist setTimeout älter als setInterval, aber alle Browser, die Sie heute treffen, unterstützen beide. Der letzte Streuner seit vielen Jahren war IE Mobile in WinMo <6.5, aber hoffentlich liegt auch das jetzt hinter uns.