@htmldeveloper

Почему промисы являются microtasks, а таймеры — просто tasks?

Или, иначе говоря, почему первее выполняется Promise, а потом Timer?

setTimeout(() => console.log('timer'), 0)
Promise.resolve().then(() => console.log('promise'));

// promise
// timer


Почему промис кладется в очередь микрозадач, а таймер кладется в очередь для web api браузера?
  • Вопрос задан
  • 8734 просмотра
Решения вопроса 1
devellopah
@devellopah
не долго гугля наткнулся на это (внутри диаграмма, которая всё объясняет)

По поводу того почему промисы оформляются как микротаски есть такое пояснение:
Treating promises as tasks leads to performance problems, as callbacks may be unnecessarily delayed by task-related things such as rendering. It also causes non-determinism due to interaction with other task sources, and can break interactions with other APIs, but more on that later.


Если коротко, в event loop по очереди выполняются таски, однако сам таск может включать некую очередь из микрозадач, которая, в свою очередь, выполнится в контексте текущего таска. То есть, если взять таски x и y, где y следует за x, то получится, что console.log('promise') выполнится в контексте таска x(в самом его конце, аккурат перед началом выполнения следующего таска), а console.log('timer') - в котексте таска y.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы