Когда что-то идёт не так
Ожидание не всегда заканчивается хорошо: сервер не отвечает, пиццерия закрыта, купон просрочен. Тогда промис не получает значение, а отклоняется с ошибкой. await в этом случае бросает ошибку, как и ошибка в вашем коде: остальная часть функции не выполняется, а консоль показывает ошибку.
В этом упражнении готовая функция checkCoupon() спрашивает пиццерию о купоне. Через секунду она выдаёт скидку в процентах, а для кода, которого пиццерия не знает, завершается ошибкой вроде Купона ABC не существует. Внутри функции промис отклоняет reject(...).
Чтобы обработать ошибку самим, поместите код, который может не сработать, в try, а то, что должно произойти в случае неудачи, — в catch:
try {
const discount = await checkCoupon(code);
message.textContent = `Ваша скидка: ${discount}%!`;
} catch (error) {
message.textContent = error.message;
}JavaScript выполняет код в try. Если всё получается, catch пропускается. Если какая-то строка бросает ошибку, выполнение сразу переходит в catch, а оставшиеся строки try не выполняются. В скобках после catch вы получаете ошибку — объект, у которого в свойстве message лежит её текст. После этого консоль ничего не показывает, потому что вы обработали ошибку сами.
После catch можно добавить finally. Его код выполняется в конце в обоих случаях — и если код в try сработал, и если нет. Это подходящее место для наведения порядка, например чтобы снова включить кнопку:
try {
// То, что может не сработать
} catch (error) {
// Что делать, если не сработало
} finally {
checkButton.disabled = false;
}Типичные ошибки:
message.textContent = error;показывает ошибку вместе с её типом впереди:Error: Купона ABC не существует.Один только текст лежит вerror.message.tryловит ошибку промиса, только если вы ждёте промис черезawaitвнутриtry.
Задание
- 1
Когда нажата
checkButton, проверьте код, введённый вcouponInput: дождитесьcheckCoupon()с помощьюawaitи покажите скидку вmessage, напримерВаша скидка: 10%!для кода PIZZA10. - 2
Введите несуществующий купон, например ABC, и нажмите кнопку: страница не меняется, а консоль показывает ошибку. Поместите строки обработчика, которые ждут
checkCoupon()и показывают скидку, вtry, а вcatchпокажите вmessageсообщение ошибки. - 3
Пока пиццерия проверяет код, показывайте
Проверяем…и отключайтеcheckButton. Включайте её снова вfinally, чтобы она работала снова независимо от того, был ли купон действительным.