Skip to main content

Що таке мікротаски (microtasks)?

Мікротаски (microtasks) - це невеликі задачі, які виконуються одразу після поточного коду (поточної макрозадачі), до того, як почнеться наступна макрозадача з черги. Вони утворюють окрему структуру - чергу мікротасків (Microtask Queue).


Ключова ідея

У JavaScript є два рівні задач:

ТипПрикладиКоли виконується
Макротаски (Tasks)setTimeout, setInterval, події DOM, колбеки fetchПісля очищення стека
Мікротаски (Microtasks)Promise.then, Promise.catch, queueMicrotask, MutationObserverОдразу після поточної задачі, до наступної макротаски

Тобто після виконання поточного коду (наприклад, функції), Event Loop спочатку перевіряє чергу мікротасків - якщо в ній є задачі, вони виконуються всі підряд, поки черга не спорожніє.


Приклад

javascript
console.log('1'); setTimeout(() => console.log('2'), 0); Promise.resolve().then(() => console.log('3')); console.log('4');

Покроково:

  1. console.log('1') -> виконується одразу Вивід: 1
  2. setTimeout(..., 0) -> колбек потрапляє в чергу макротасків (task queue)
  3. Promise.then(...) -> колбек потрапляє в чергу мікротасків
  4. console.log('4') -> виконується одразу Вивід: 4
  5. Поточний стек порожній -> виконуються всі мікротаски -> console.log('3')
  6. Тільки після цього виконуються макротаски -> console.log('2')

Підсумковий порядок виводу:

javascript
1 4 3 2

Що створює мікротаски

ДжерелоПриклад
PromisePromise.resolve().then(...)
queueMicrotask()queueMicrotask(() => { ... })
MutationObserverВідстеження змін DOM

Відмінність мікротасків від макротасків

ВластивістьМікротаскиМакротаски
ЧергаMicrotask QueueTask Queue
ПрикладиPromise.then, queueMicrotasksetTimeout, fetch, click
ПріоритетВищий - виконуються ранішеНижчий
Коли виконуютьсяПісля поточного коду, але до наступної подіїПісля всіх мікротасків

Обережно з мікротасками

Якщо нескінченно додавати нові мікротаски всередині then, рушій ніколи не дійде до наступної макротаски - вийде "заморожений" Event Loop:

javascript
function loop() { Promise.resolve().then(loop); } loop(); // браузер зависне

Підсумок

ТермінОпис
MicrotaskМаленька задача, що виконується після поточного коду і до наступної макротаски
Черга мікротасківЗберігає колбеки Promise.then, queueMicrotask тощо
ПріоритетВищий, ніж у макротасків
Порядок Event LoopСтек -> всі мікротаски -> наступна макротаска

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.