Выбор ответа Senior Event loop и libuv обновлено

nextTick внутри промиса

Вопрос

Что выведет CommonJS-скрипт?

Promise.resolve().then(() => {
  console.log('p1');
  process.nextTick(() => console.log('tick2'));
}).then(() => console.log('p2'));
process.nextTick(() => console.log('tick1'));

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: tick1 p1 p2 tick2. Сначала очередь nextTick: tick1.

Варианты ответа

  1. tick1 p1 tick2 p2
  2. p1 tick1 p2 tick2
  3. tick1 p1 p2 tick2правильный ответ
  4. p1 p2 tick1 tick2

Разбор

Сначала очередь nextTick: tick1. Потом очередь микрозадач промисов, и Node выполняет её до конца: p1, затем цепочка добавляет p2, он тоже выполняется в этом же проходе. Только когда очередь промисов пуста, Node снова проверяет nextTick и выводит tick2.

  • tick1 p1 tick2 p2 предполагает, что nextTick прерывает очередь промисов. В Node 22 этого нет.
  • Варианты с p1 первым неверны: в CommonJS nextTick идёт раньше промисов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме