@Torento20345

Как микротаски определяют скорость выполнения промиса?

Как браузер понимает, что нам вернет без задержки в коде обе операции в then, а не разделит их на разные таски?
new Promise(resolve => {resolve()}).then(()=> 'one')).then(()=>'two')
  • Вопрос задан
  • 201 просмотр
Решения вопроса 2
Aetae
@Aetae Куратор тега JavaScript
Тлен
Никак.
Таски разные:
l = (text) => console.log(performance.now(), text) || true;

new Promise(resolve => {l('a1')&&resolve()}).then(()=> l('a2')&&'one').then(()=>l('a3')&&'two');
new Promise(resolve => {l('b1')&&resolve()}).then(()=> l('b2')&&'one').then(()=>l('b3')&&'two');
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
У микротасок отдельная очередь выполнения. Если очень примитивно представить event-loop браузера, то получится код вроде такого:
// весь event-loop
while (true) {
  // цикл микротасок:
  while (!microtaskQueue.isEmpty) {
    microtaskQueue.runNext();
  }

  if (!macrotaskQueue.isEmpty) {
    macrotaskQueue.runNext()
  }
}
Как видно из этого псевдокода, очередь микротасков будет выполнятся пока она не закончится, а очередь макротасков будет выполнять по 1 таске на итерацию event-loop. Соответственно, если в микротаске добавить в очередь еще одну микротаску, то она выполнится на той же итерации event-loop до того как управление перейдет к макротаскам.
Этим кстати объясняется то, что такая функция вешает вкладку браузера намертво:
function microtaskBomb() {
  return Promise.resolve().then(microtaskBomb);
}


И да, в моем примере очень примитивное представление event-loop. На самом деле там происходит гораздо больше интересных вещей. Например requestAnimationFrame живут в своей очереди, которая тоже обрабатывается по особенному.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы