JavaScript: обратный вызов
чем отличаются SetTimeout, setImmediate и process.nextTick в JavaScript и Node.js

Функции 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
, будут встраиваться в очередь событий по определенным правилам, указанным выше.
Спасибо за внимание.