Что выведет код Middle Промисы и async/await обновлено

race не отменяет проигравших

Вопрос

Что выведет код? По строке на каждый вывод.

const wait = (ms, v) =>
  new Promise((resolve) =>
    setTimeout(() => {
      console.log('готов ' + v);
      resolve(v);
    }, ms));
(async () => {
  const r = await Promise.race([wait(30, 'медленный'), wait(10, 'быстрый')]);
  console.log('race: ' + r);
})();

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: готов быстрый, race: быстрый, готов медленный. race выполняется первым завершившимся промисом: через 10 мс печатается готов быстрый, и сразу после этого (микрозадачей) продолжается async-функция: race: быстрый.

Что выведет

готов быстрый
race: быстрый
готов медленный

Разбор

race выполняется первым завершившимся промисом: через 10 мс печатается готов быстрый, и сразу после этого (микрозадачей) продолжается async-функция: race: быстрый. Медленная операция не отменяется: промисы не умеют отменяться, и через 30 мс её таймер всё равно срабатывает и печатает готов медленный.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме