PassFront
  1. PassFront
  2. База знаний
  3. Event Loop и асинхронность

В чём разница между process.nextTick, setImmediate и setTimeout(fn, 0)?

Event Loop и асинхронность

`process.nextTick` выполняется сразу после текущей операции, до любых других колбэков. `setImmediate` — в фазе check, после poll. `setTimeout(fn, 0)` — в фазе timers, и реально ждёт минимум 1 мс.

Приоритеты

  • process.nextTick — своя очередь, она разбирается раньше очереди промисов.
  • Колбэки Promise.then — очередь микрозадач.
  • setTimeout(..., 0) и setImmediate — макрозадачи в разных фазах.

Порядок в примере

setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));
process.nextTick(() => console.log('nextTick'));
Promise.resolve().then(() => console.log('promise'));
// nextTick → promise → timeout / immediate

Внутри колбэка ввода-вывода setImmediate всегда раньше setTimeout, потому что после poll идёт фаза check.

Подвох

Рекурсивный process.nextTick никогда не отдаёт управление циклу и «голодит» ввод-вывод. Для разбиения тяжёлой работы на части лучше setImmediate.

Коротко для собеседования

Порядок: nextTick, микрозадачи Promise, потом макрозадачи. setImmediate создан, чтобы выполниться сразу после ввода-вывода, а nextTick не следует злоупотреблять.

Другие вопросы раздела