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