Цикл событий
Часть раздела Основы 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 означает, что выполнение произойдёт как можно скорее после микрозадач, но никогда не раньше них. Таймеры срабатывают в порядке задержки; при одинаковой задержке первым срабатывает таймер, установленный первым.
Задание
ЛегкоNode выполняет ваш код в фиксированном порядке. Сначала обычные строки, затем микрозадачи, например обратные вызовы промисов, а затем таймеры. Используйте этот порядок, чтобы четыре строки вывелись в числовом порядке, не перемещая их.
order.js выводит четыре строки от 4 до 1. Не перемещайте и не меняйте строки местами. Вместо этого оберните три из них, чтобы они выполнялись позже.
- Оставьте
console.log('1 sync')без изменений. Обычный код выполняется первым. - Оберните строку
2 microtaskвqueueMicrotask, чтобы она выполнилась сразу после обычного кода. - Оберните строку
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');
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы Node.js
Потренируйтесь самостоятельно: Песочница Express