Выбор ответа Senior Промисы и async/await обновлено

return без await внутри try

Вопрос

api.post() возвращает отклонённый промис. Сработает ли catch внутри save?

async function save(data) {
  try {
    return api.post(data);
  } catch (err) {
    console.log('поймано');
    return null;
  }
}

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

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

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

Коротко

Правильный ответ: Нет: промис отдан без await, отклонение придёт после выхода из try. return api.post(data) отдаёт промис наружу как результат, не дожидаясь его.

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

  1. Да: try/catch в async-функции ловит любые ошибки внутри, в том числе в return
  2. Да, но только в строгом режиме, где отклонения превращаются в исключения
  3. Нет: промис отдан без await, отклонение придёт после выхода из tryправильный ответ
  4. Нет, потому что catch в async-функциях не работает, нужен .catch()

Разбор

return api.post(data) отдаёт промис наружу как результат, не дожидаясь его. Блок try завершается сразу, а отклонение случится позже, когда catch уже не активен. В итоге save() отклонится с исходной ошибкой. Исправление: return await api.post(data): тогда ошибка возникнет внутри try и будет поймана. Вне try разницы между return и return await практически нет, а внутри она принципиальна. Сам try/catch в async-функциях работает с await прекрасно.

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

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

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