Проверяет понимание порядка обработки новых макрозадач в цикле событий JavaScript.
Цикл событий (Event Loop) в JavaScript управляет выполнением кода, используя очередь задач. Когда вы создаете новую макрозадачу (например, через setTimeout или обработчик события), она не выполняется мгновенно, а помещается в конец очереди макрозадач. Это фундаментальное правило гарантирует, что текущий выполняемый код не будет прерван, и все операции выполняются в предсказуемом порядке.
Цикл событий работает по следующему принципу:
Таким образом, если во время выполнения макрозадачи вы добавили новую макрозадачу, она будет обработана только после того, как текущая макрозадача завершится и все микрозадачи будут выполнены. Это предотвращает «голодание» микрозадач и обеспечивает справедливое распределение времени.
console.log('Начало');
setTimeout(() => {
console.log('Макрозадача 1');
setTimeout(() => console.log('Макрозадача 2'), 0);
}, 0);
Promise.resolve().then(() => console.log('Микрозадача'));
console.log('Конец');
// Вывод: Начало, Конец, Микрозадача, Макрозадача 1, Макрозадача 2В этом примере сначала выполняется синхронный код, затем микрозадача (промис), и только потом первая макрозадача. Внутри первой макрозадачи создаётся вторая, которая попадает в конец очереди и выполняется после завершения первой.
Понимание этого механизма важно для написания эффективного асинхронного кода. Например, если вы хотите разбить тяжёлую операцию на части, чтобы не блокировать интерфейс, вы можете использовать setTimeout для планирования следующих шагов. Это позволяет браузеру обрабатывать пользовательские события между частями.
Итог: Новая макрозадача обрабатывается только после завершения текущей и всех микрозадач. Это ключевое правило для предсказуемого поведения асинхронного кода и важно учитывать при оптимизации производительности и избегании блокировок.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию