Почему старайтесь не использовать setInterval

внешний интерфейс сервер JavaScript Ajax

При разработке инструмента онлайн-чата часто возникает необходимость повторного выполнения операции через несколько миллисекунд. «Нет проблем, — говорили все, — просто используйте setInterval».

Одной из причин: SetInterval игнорирует ошибки кода

setInterval имеет неприятную привычку быть безразличным к тому, сообщает ли вызываемый им код об ошибке. Другими словами, если код, выполняемый setInterval, по какой-то причине пойдет не так, он продолжит (независимо от) вызов этого кода.посмотреть демо

Вторая причина: setInterval игнорирует сетевую задержку

Предположим, вы время от времени опрашиваете сервер через Ajax, чтобы увидеть, есть ли какие-либо новые данные (примечание: если вы это делаете, я боюсь, что вы делаете это неправильно; рекомендуется использовать"отложенный опрос"). И по какой-то причине (перегрузка сервера, временное отключение, всплески трафика, ограниченная пропускная способность пользователя и т. д.) ваш запрос выполняется гораздо дольше, чем вы думаете. Но setInterval все равно. Он по-прежнему будет регулярно запускать запросы, и в конечном итоге ваша сетевая очередь на стороне клиента заполнится вызовами Ajax.см. пример

Причина третья: setInterval не гарантирует выполнение

В отличие от setTimeout, вы не можете гарантировать, что код будет выполняться по истечении заданного интервала времени. Если вы вызываете функцию, выполнение которой занимает много времени, некоторые вызовы будут просто проигнорированы.см. пример

Решение простое: используйте setTimeout

Вместо использования setInterval вызовите саму функцию с помощью setTimeout в нужный момент. В предыдущих двух примерах функция a, использующая setInterval, работала неправильно, а функция b, использующая setTimeout, работала нормально.

Что, если интервалы должны быть гарантированно равны?

如果确实要保证事件“匀速”被触发,那可以用希望的延迟减去上次调用所花时间,然后将得到的差值作为延迟动态指定给setTimeout。 Однако следует отметить, чтоТаймер JavaScript не очень точный. Таким образом, вы не можете получить абсолютно «среднюю» задержку даже с setInterval по многим причинам (например, сборка мусора, JavaScript является однопоточным и т. д.). Кроме того, текущие браузеры также фиксируют минимальное время ожидания от 4 мс до 15 мс. Так что не надейтесь на полное отсутствие ошибок.