dr.Brain

doctor Brain

мир глазами веб-разработчика

JavaScript: обратный вызов

чем отличаются SetTimeout, setImmediate и process.nextTick в JavaScript и Node.js

dr.Brain

время чтения 2 мин.

Photo by Jon Tyson on Unsplash

Функции SetTimeout, setImmediate и process.nextTick очень похожи, запуская обратный вызов по завершнии текущего цикла событий (Event Loop).

SetTimeout

SetTimeout выполняется с задержкой, длительность которой устанавливается в миллисекундах. На практике задержка может продлиться дольше, так как функция выполняется в начале следующего цикла событий, после завершения всей очереди текущего цикла событий. Если таймер установлен на 0, вызов функции происходит “немедленно” - она занимает первое место в очереди событий (Event Queue) следующего цикла событий.

Сам таймер функции SetTimeout не занимает место в очереди событий и вовлекает ресурсы, находящиеся за пределами основного потока.

setImmediate

setImmediate очень похожа на SetTimeout и используется для прерывания длительных операций и запуска функции обратного вызова сразу после того, как браузер завершит текущий цикл событий. Обычно, выполнение этой функции происходит после SetTimeout.

В настоящее время функция setImmediate не соответствует признанным стандартам и не рекомендована к использованию на действующих сайтах, как устаревшая.

process.nextTick

Метод process.nextTick взааимодействует с циклом событий по своему сценарию, запуская функцию обратного вызова сразу после завершения текущего цикла. Можно представить, что process.nextTick встраивается между текущим и следующим циклами, хотя на самом деле он получает максимальный приоритет, отодвигая события в самом начале следующего цикла событий. process.nextTick всегда выполняется до SetTimeout и setImmediate.

Тик (tick) - один полный проход цикла событий

Например:

function run() {
  setTimeout(() => console.log(" I am setTimeout"), 0);
  setImmediate(() => console.log("I am setImmediate"));
  process.nextTick(() => console.log("I am nextTick"));
  console.log("I am current event loop");
}

run()

Получаем в консоли:

I am current event loop
I am nextTick
I am setTimeout
I am setImmediate

Таким образом, SetTimeout, setImmediate и process.nextTick, будут встраиваться в очередь событий по определенным правилам, указанным выше.


Спасибо за внимание.

Новые публикации

Далее

Категории

О нас

Frontend & Backend. Статьи, обзоры, заметки, код, уроки.