В чём разница между 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 не следует злоупотреблять.