Выбор ответа Middle Асинхронные паттерны обновлено

return промиса без await внутри try

Вопрос

Что выведет код?

async function f() {
  try {
    return Promise.reject(new Error('boom'));
  } catch (e) {
    return 'caught';
  }
}
f().then(console.log, (e) => console.log('rejected', e.message));

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: rejected boom. return promise без await сразу выходит из try: функция возвращает промис, который отклонится позже, уже вне блока. catch внутри f не срабатывает, а внешний обработчик получает ошибку.

Варианты ответа

  1. caught
  2. rejected boomправильный ответ
  3. undefined
  4. Необработанная ошибка, процесс упадёт

Разбор

return promise без await сразу выходит из try: функция возвращает промис, который отклонится позже, уже вне блока. catch внутри f не срабатывает, а внешний обработчик получает ошибку. С return await вывод был бы caught.

  • caught это поведение версии с await.
  • Значение есть: промис отклонён с ошибкой.
  • Процесс не падает: у внешнего then есть обработчик отклонения.

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

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

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