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

setTimeout(0) против setImmediate на верхнем уровне

Вопрос

В главном модуле (не внутри I/O-колбэка) вызваны подряд setTimeout(() => log("t"), 0) и setImmediate(() => log("i")). Какой порядок вывода?

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

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

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

Коротко

Правильный ответ: Не определён: зависит от прошедшей 1 мс. setTimeout(fn, 0) превращается в 1 мс.

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

  1. Всегда t, потом i: таймеры раньше check
  2. Всегда i, потом t: check раньше таймеров
  3. Определяется порядком вызова в коде
  4. Не определён: зависит от прошедшей 1 мсправильный ответ

Разбор

setTimeout(fn, 0) превращается в 1 мс. Если к моменту входа в фазу timers миллисекунда уже прошла, первым будет t, иначе цикл пропустит таймер, дойдёт до check и выведет i. Это зависит от производительности процесса, поэтому порядок не определён.

  • Варианты «всегда t» и «всегда i» неверны по этой причине.
  • Порядок вызова в коде не важен: колбэки живут в разных фазах.

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

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

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