Если вы используете setTimeout()
, чтобы быстро уступить браузеру , чтобы его поток пользовательского интерфейса мог справиться с любыми задачами (например, обновить вкладку или не отображать длинную строку). Запуск скрипта), есть новый API под названием Эффективный выход скрипта , он же, setImmediate()
, который может работать немного лучше для вас.
setImmediate()
работает очень похоже на setTimeout()
, но может запускаться немедленно, если браузеру больше нечего делать. Во многих ситуациях, когда вы используете setTimeout(..., 16)
или setTimeout(..., 4)
или setTimeout(..., 0)
(т. Е. Вы хотите, чтобы браузер выполнял любые невыполненные задачи потока пользовательского интерфейса и не отображал диалоговое окно «Long Running Script»), вы можете просто заменить setTimeout()
setImmediate()
, отбрасывая второй (миллисекунда) аргумент.
Разница с setImmediate()
в том, что это в основном доход; если браузер должен когда-нибудь сделать что-либо в потоке пользовательского интерфейса (например, обновить вкладку), он сделает это до возврата к вашему обратному вызову. Однако, если браузер уже полностью справился со своей работой, обратный вызов, указанный в setImmediate()
, по существу будет работать без задержки.
К сожалению, в настоящее время он поддерживается только в IE9 +, поскольку есть откат от других поставщиков браузеров.
Существует хороший полифилл , доступный, хотя, если вы хотите использовать его и надеетесь, что другие браузеры реализуют его в какой-то момент.
Если вы используете setTimeout()
для анимации , requestAnimationFrame - ваш лучший выбор, поскольку ваш код будет работать синхронно с частотой обновления монитора.
Если вы используете setTimeout()
на более медленном темпе , например, каждые 300 миллисекунд вы можете использовать решение, подобное тому, что предлагает user1213320, где вы отслеживаете, сколько времени прошло с последней отметки времени, на котором работал ваш таймер, и компенсируете любую задержку. Одним из улучшений является то, что вы можете использовать новый интерфейс High Resolution Time (он же window.performance.now()
) вместо Date.now()
, чтобы получить разрешение больше миллисекунды для текущего времени.