Какие микротаски кроме Promise существуют в JavaScript?
Что проверяют
Знаете ли вы, что микрозадачи ставит в очередь не только Promise, и понимаете ли, в каком порядке они выполняются относительно синхронного кода и макрозадач. Следом почти всегда дают фрагмент кода и просят назвать порядок вывода.
Как отвечать
Сначала коротко про модель: после каждой макрозадачи (скрипт, setTimeout, обработчик события) движок полностью опустошает очередь микрозадач, и только потом браузер может отрисовать кадр и взять следующую макрозадачу. Источники микрозадач в браузере:
- реакции промисов: колбэки
then,catch,finally; await: продолжениеasync-функции послеawaitставится микрозадачей, даже если справа стоит не промис, а обычное значение;queueMicrotask(fn): прямой способ поставить функцию в ту же очередь без создания промиса. Ошибка внутри не превращается в отклонённый промис, а уходит в обработчик необработанных ошибок;MutationObserver: колбэк вызывается микрозадачей один раз на пачку изменений DOM, а не на каждое изменение.
Если собеседование про Node.js, добавьте process.nextTick: формально это отдельная очередь, и она выполняется раньше промисных микрозадач.
Порядок внутри очереди строго FIFO, приоритета между queueMicrotask и then нет:
console.log('Start');
Promise.resolve().then(() => console.log('P1'));
queueMicrotask(() => console.log('Q1'));
console.log('End');
// Start, End, P1, Q1Синхронный код всегда доходит до конца первым, затем микрозадачи в порядке постановки.
Где спотыкаются
Относят к микрозадачам setTimeout(fn, 0), requestAnimationFrame или postMessage. Первое и последнее это макрозадачи, а requestAnimationFrame вообще отдельный этап перед отрисовкой.
Думают, что queueMicrotask выполняется раньше then, и путают порядок в задачках на вывод. Очередь одна: кто раньше встал, тот раньше выполнился.
Не знают, что бесконечная цепочка микрозадач блокирует страницу: отрисовка не наступит, пока очередь не опустеет. Рекурсивный setTimeout интерфейс не вешает, рекурсивный queueMicrotask вешает.