Почему эта микрозадача выполняется перед макрозадачей в цикле событий? - PullRequest
0 голосов
/ 25 августа 2018

Насколько я понимаю, полная очередь задач микрозадачи обрабатывается после каждой макрозадачи.

Если это так, почему обратный вызов setTimeout выполняется после PromiseМикрозадачи в следующем фрагменте JavaScript?

console.log('start');

setTimeout(() => {
  console.log("setTimeout");
});

Promise.resolve().then(function() {
  console.log('promise');
});

console.log('end');

Выводит следующее:

> "start"
> "end"
> "promise"
> "setTimeout"

Это из-за задержки ~ 4ms, навязанной современными браузерами?

С MDN :

В современных браузерах вызовы setTimeout() / setInterval() сокращаются до минимума один раз каждые 4 мс, когда срабатывают последовательные вызовы из-заВложение обратного вызова (где уровень вложенности составляет, по крайней мере, определенную глубину) или после определенного количества последовательных интервалов.

Хотя это говорит о том, что это верно только для последовательного вложения обратного вызова.

1 Ответ

0 голосов
/ 25 августа 2018

Насколько я понимаю, полная очередь задач микрозадачи обрабатывается после каждой макрозадачи.

Да. И код, который вы запустили, от console.log('start') до console.log('end'), , является такой макрозадачей. После того, как она добралась до завершения, обрабатывается очередь микрозадач с обратными вызовами обещания, и только после этого запускается следующая макрозадача (тайм-аут).

...