Работа с ошибками в JavaScript обещаниях
Для удобства обработки ошибочных ситуаций, спецификация JavaScript обещаний предоставляет нам синтаксическую конструкцию, с помощью которой мы можем обрабатывать ошибки (rejections) промисов.
Предположим, у нас есть функция, называемая searchForProduct(prodId),которая возвращает обещание, которое будет успешно завершено, если продукт с таким идентификатором будет найден в базе, или будет завершено с ошибкой (отклонено), если товара с таким идентификатором нет. Используя метод catch() мы можем сделать наш код легче для тех, кто будет его читать:
searchForProduct(123)
.then(function (price) {
console.log('Данный товар стоит: ' + price + ' руб.')
})
.catch(function (error){
console.log('Товар временно отсутствует')
})
Вывод может быть таким: Данный товар стоит: 50 руб., если обещание завершится успехом или 'Товар временно отсутствует', в случае если идентификатор не будет найден.
В том случае, если вы хотите использовать только метод .then() представленный выше кусок кода примет следующий вид:
searchForProduct(123)
.then(function (price) {
console.log('Данный товар стоит: ' + price + ' руб.')
}, null)
.then(null, function (error){
console.log('Товар временно отсутствует')
})
Как видно, мы использовали цепочку вызовов метода .then(), при этом в каждом из вызовов мы пропустили ненужные обработчики onFulfilled и onRejected простой передачей null.
Запомните! Если обещание завершилось с ошибкой, то исполнение кода будет остановлено на первом вызове методов .catch() или .then(). У последнего должен присутствовать обработчик onReject.
Это означает, что, если мы вызовем нашу функцию searchForProduct() с идентификатором, который не существует вот так:
searchForProduct(99999)
.then(function (price) {
console.log('Данный товар стоит: ' + price + ' руб.')
return price
})
.then(function (price) {
console.log('Удвоенная сумма: ' + (price \* 2))
})
.catch(function (error){
console.log('Товар временно отсутствует')
})
оба метода .then() будут пропущены (так как ни у одного из них нет обработчика onReject) и будет исполнен только метод .catch().
Обратите внимание на два образца кода ниже, в них присутствует едва уловимое различие:
Пример 1:
searchForProduct(123)
.then(function (price) {
// поиск другого товара
return searchForProduct(456)
}, function (error){
console.log('Товар с ID 123 не найден!')
})
Пример 2:
searchForProduct(123)
.then(function (price) {
// поиск другого товара
return searchForProduct(456))
})
.catch(function (error){
console.log('Товар с ID 123 и ID 456 не найдены')
})
В первом примере, если товар с ID 123 не существует, будет исполнен следующий вызов метода .then() с обработчиком onReject:
- В этом случае мы увидим: Товар с ID 123 не найден!
- Однако, в первом примере нет вызова обработчика onReject или метода .catch() в случае ошибки. Поэтому, если товар с ID 456 отсутствует, ничего напечатано не будет. Будет брошена ошибка Uncaught error.
Важное замечание: когда у вас есть вызов метода then(onFulfilled, onRejected), будет выполнен только один из обработчиков, но не оба.
Во втором примере:
- Если товар с ID 123 не существует, будет выполнен метод catch() и будет напечатано 'Товар с ID 123 и ID 456 не найдены'
- Также, так как после вызова then у нас идет вызов catch по цепочке, то любая ошибка, возникающая во втором методе, будет перехвачена в вызове метода catch(). Таким образом, если товар с ID 456 не существует, мы также получим сообщение 'Товар с ID 123 и ID 456 не найдены'.
На этом все, а в следующих статьях мы продолжим изучать промисы в JavaScript.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.