Menu
CoddyTech

Цикл событий

Часть раздела Основы Node.js путешествия по Node.js на Coddy. Урок 26 из 33.

Колбэки и промисы выполняются позже, и ошибки возникают, когда неизвестно точно, когда именно это произойдёт.

Сначала Node выполняет весь синхронный код до конца. Затем выполняет микрозадачи: колбэки промисов и функции, переданные в queueMicrotask. И только потом запускаются таймеры. setTimeout(fn, ms) выполняет fn один раз, через ms миллисекунд. Даже setTimeout(fn, 0) ждёт, пока завершатся микрозадачи.

setTimeout(() => console.log('C timer'), 0);
Promise.resolve().then(() => console.log('B promise'));
console.log('A sync');
// A sync, B promise, C timer

Задержка 0 означает, что выполнение произойдёт как можно скорее после микрозадач, но никогда не раньше них. Таймеры срабатывают в порядке задержки; при одинаковой задержке первым срабатывает таймер, установленный первым.

challenge icon

Задание

Легко

Node выполняет ваш код в фиксированном порядке. Сначала обычные строки, затем микрозадачи, например обратные вызовы промисов, а затем таймеры. Используйте этот порядок, чтобы четыре строки вывелись в числовом порядке, не перемещая их.

order.js выводит четыре строки от 4 до 1. Не перемещайте и не меняйте строки местами. Вместо этого оберните три из них, чтобы они выполнялись позже.

  1. Оставьте console.log('1 sync') без изменений. Обычный код выполняется первым.
  2. Оберните строку 2 microtask в queueMicrotask, чтобы она выполнилась сразу после обычного кода.
  3. Оберните строку 3 timeout и строку 4 timeout later каждую в собственный setTimeout. setTimeout(fn, ms) запускает функцию fn один раз через ms миллисекунд. Строка 4 задаётся раньше строки 3, поэтому для неё нужна более длительная задержка.

node order.js затем выводит:

1 sync
2 microtask
3 timeout
4 timeout later

Попробуйте: прежде чем запускать код, предположите, в каком порядке появятся строки. Затем нажмите «Играть»; в терминале появится $ node order.js. Далее задайте обоим таймерам задержку 0 и запустите код снова: теперь 4 timeout later выводится перед 3 timeout, потому что при одинаковых задержках первым запускается таймер, заданный первым. Верните более длительную задержку для строки 4, прежде чем нажать «Проверить».

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

// Сделайте так, чтобы эти строки выводились в порядке номеров, не перемещая их.
// Вместо этого оберните их в queueMicrotask и setTimeout.
console.log('4 timeout later');
console.log('3 timeout');
console.log('2 microtask');
console.log('1 sync');
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы Node.js

Потренируйтесь самостоятельно: Песочница Express