Вопрос проверяет понимание взаимодействия рекурсии, промисов и Event Loop в JavaScript, а также умение выявлять причины блокировки цикла событий.
Когда рекурсивный вызов помещается в .then() промиса, он создает новую микрозадачу. Event Loop обрабатывает все микрозадачи из очереди перед переходом к следующей макрозадаче. Если рекурсия бесконечна, очередь микрозадач никогда не опустеет, и Event Loop застрянет на их обработке.
function recursivePromise() {
return Promise.resolve().then(() => {
console.log('Microtask');
return recursivePromise(); // бесконечная рекурсия
});
}
recursivePromise();
// Event Loop зависает, макрозадачи не выполняются.then() добавляет микрозадачу в очередь.Если использовать setTimeout (макрозадача), рекурсия не блокирует Event Loop, так как каждая итерация планируется как отдельная макрозадача, позволяя обрабатывать другие задачи между ними.
function recursiveTimeout() {
setTimeout(() => {
console.log('Macrotask');
recursiveTimeout(); // безопасно
}, 0);
}Избегайте бесконечных рекурсивных вызовов через промисы, так как это блокирует Event Loop. Для рекурсивных операций с задержками используйте макрозадачи (setTimeout/setInterval) или прерывайте рекурсию по условию.
Уровень
Рейтинг:
4
Сложность:
7
Навыки
JavaScript
Networks
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию