Выбор ответа Middle Event loop и libuv обновлено
setTimeout(0) против setImmediate на верхнем уровне
Вопрос
В главном модуле (не внутри I/O-колбэка) вызваны подряд setTimeout(() => log("t"), 0) и setImmediate(() => log("i")). Какой порядок вывода?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Не определён: зависит от прошедшей 1 мс. setTimeout(fn, 0) превращается в 1 мс.
Варианты ответа
- Всегда
t, потомi: таймеры раньше check - Всегда
i, потомt: check раньше таймеров - Определяется порядком вызова в коде
- Не определён: зависит от прошедшей 1 мсправильный ответ
Разбор
setTimeout(fn, 0) превращается в 1 мс. Если к моменту входа в фазу timers миллисекунда уже прошла, первым будет t, иначе цикл пропустит таймер, дойдёт до check и выведет i. Это зависит от производительности процесса, поэтому порядок не определён.
- Варианты «всегда t» и «всегда i» неверны по этой причине.
- Порядок вызова в коде не важен: колбэки живут в разных фазах.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Event loop и libuv»
- Тяжёлый цикл без блокировки event loop
- Код-ревью: что блокирует event loop
- Что блокирует event loop
- Объясни event loop в Node.js
- Рекурсивный process.nextTick
- process.nextTick и setImmediate
- Event loop Node и браузера: в чём разница
- Порядок nextTick, промиса и setTimeout