Выбор ответа 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) отдаёт промис наружу как результат, не дожидаясь его.
Варианты ответа
- Да:
try/catchв async-функции ловит любые ошибки внутри, в том числе вreturn - Да, но только в строгом режиме, где отклонения превращаются в исключения
- Нет: промис отдан без
await, отклонение придёт после выхода изtryправильный ответ - Нет, потому что
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 ошибок.