Вопрос по работе движка! Что хуже? Бесконечные таймеры или промисы? И почему? Такой вопрос задали на собеседовании. Кто может пояснить?
Если говорить про бесконечность, то ответ - хуже Promise
.
Особенность микротасок в том, что они выполняются в первую очередь после окончания текущей таски, пока не очистится собственная очередь микротасок. Таким образом, если микротаска создает микротаску и так до бесконечности, то это полностью заблокирует event loop
.
В свою очередь бесконечный нулевой таймер (интервал, скорее) создает таску в конец текущей очереди. Если очередь пуста, то код в таймере выполнится сразу. Если очередь имеет задания, то выполнятся сначала они, а потом ваш timer-callback
.
const int0 = setInterval(() => console.log('interval 0'))
const int10 = setInterval(() => console.log('interval 10'))
setTimeout(() => {
clearInterval(int0);
clearInterval(int10);
console.log('Если бы код был заблокирован интервалами, мы бы не смогли вызвать эту функцию');
}, 200);
Ни один интервал не блокирует выполнение другого асинхронного кода полностью. Основная очередь пополняется последовательно то одним, то другим (в случае других значений timeout
картина была бы другой, но смысл то же).
function infinitePromise() {
return new Promise(res => {
console.log('Бесконечный промис');
res();
}).then(() => infinitePromise());
}
setTimeout(() => console.log('Этот код никогда не выполнится'), 200);
infinitePromise();
В этом случае очередь микротасок никогда не очистится и setTimeout
не сможет поставить задание в очередь.
Термины, типа хуже/лучше
немного странные в этом случае. Но если конкретно про возможность браузерного движка дышать между выполнением вашего кода, то setInterval
- больше похоже на нормальное сердцебиение. Promise - это смерть от таскоизлияния.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Существует множество готовых плагинов для создания слайдера-карусели на сайтеНе хочется изобретать велосипед, но ни разу не встречала реализация,...
пытаюсь переместить второе меню в правую часть экрана, но не выходитЯ плохо разбираюсь в позиционирование элементов, не могли бы вы подсказать...
Я пытаюсь создать эффект анимации блеска с радиальным градиентом для блока div, но я не уверен, что мой способ, - лучший способ сделать это
Всё глубже и глубже погружаясь в C++, я начинаю немного сходить с ума, виной этому то, что некоторые вещи я просто не могу объяснить, а заучивать...