Есть ли разница?
Да. Тайм-аут выполняется определенное количество времени после вызова setTimeout (); Интервал выполняется определенное количество времени после срабатывания предыдущего интервала.
Вы заметите разницу, если ваша функция doStuff () займет некоторое время для выполнения. Например, если мы представляем вызов setTimeout / setInterval с .
, запуск тайм-аута / интервала с *
и выполнение кода JavaScript с [-----]
, временные шкалы выглядят следующим образом:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
Следующая сложность заключается в том, что интервал срабатывает, когда JavaScript уже занят чем-то (например, обработкой предыдущего интервала). В этом случае интервал запоминается и происходит, как только предыдущий обработчик завершает работу и возвращает управление браузеру. Так, например, для процесса doStuff (), который иногда короткий ([-]), а иногда длинный ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• представляет интервал срабатывания, который не мог выполнить свой код сразу, а вместо этого был сделан ожидающим.
Таким образом, интервалы пытаются «наверстать упущенное», чтобы вернуться в график. Но они не стоят в очереди друг над другом: за интервал может быть только одно ожидание выполнения. (Если они все встанут в очередь, браузер останется с постоянно расширяющимся списком выдающихся казней!)
. * • • x • • x
[------][------][------][------]
x представляет интервал срабатывания, который не мог быть выполнен или ожидался, поэтому вместо этого он был отброшен.
Если ваша функция doStuff () обычно выполняется дольше, чем установленный для нее интервал, браузер потребляет 100% ресурсов ЦП, пытаясь ее обслуживать, и может стать менее отзывчивым.
Что вы используете и почему?
Chained-Timeout дает гарантированный слот свободного времени браузеру; Интервал пытается обеспечить выполнение выполняемой функции как можно ближе к запланированному времени за счет доступности пользовательского интерфейса браузера.
Я бы рассмотрел интервал для одноразовых анимаций, которые я хотел бы сделать как можно более плавными, в то время как цепочечные тайм-ауты более вежливы для текущих анимаций, которые будут происходить все время, пока страница загружается. Для менее требовательного использования (например, тривиальное обновление обновлений каждые 30 секунд или что-то в этом роде) вы можете безопасно использовать любой из них.
Что касается совместимости браузеров, setTimeout предшествует setInterval, но все браузеры, которые вы встретите сегодня, поддерживают оба. Последним бродягой на протяжении многих лет был IE Mobile в WinMo <6.5, но, надеюсь, это уже позади.