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