Вопрос проверяет понимание того, как неправильная работа с microtask может привести к проблемам с производительностью.
Да, микрозадачи могут заблокировать рендер браузера. Браузер выполняет все microtask перед тем, как перейти к рендеру. Если microtask постоянно добавляют новые microtask, рендер откладывается. Это состояние называется starvation.
Перед перечислением важно понять порядок шагов.
Выполняется текущий JavaScript
Выполняются все microtask
Только после этого возможен рендер
Если внутри microtask создаётся новая microtask:
function loop() {
Promise.resolve().then(loop);
}
loop();
Очередь microtask никогда не становится пустой
Браузер не доходит до шага рендера
UI “зависает”
После каждой macrotask браузер может выполнить рендер
Macrotask не имеют приоритета над рендером
Поэтому setTimeout безопаснее для долгих циклов
Осторожно с рекурсивными Promise
Не делайте тяжёлые вычисления в microtask
Для длительных процессов используйте:
setTimeout
requestIdleCallback
Web Workers
Microtask могут заблокировать рендер, если очередь никогда не опустошается. Это редкая, но важная ловушка, которую любят спрашивать на собеседованиях.