Promise. Метод catch

Время чтения: меньше 5 мин

Эта статья связана с понятием Promise.

Кратко

Секция статьи "Кратко"

Метод catch используют для обработки ошибки при выполнении асинхронной операции.

Метод принимает один аргумент:

  • onReject — функция-колбэк, которая будет вызвана при переходе промиса в состояние «ошибка» rejected. Функция имеет один параметр, в который передаётся информация об ошибке

Возвращает промис.

Как пишется

Секция статьи "Как пишется"
        
          
          // getPasswords() — асинхронная функция, которая возвращает промисgetPasswords()  .then(function (result) {    // выполнится, если операция успешна  })  .catch(function (err) {    // колбэк выполнится, если getPassword завершится ошибкой    alert(err.message)  })
          // getPasswords() — асинхронная функция, которая возвращает промис
getPasswords()
  .then(function (result) {
    // выполнится, если операция успешна
  })
  .catch(function (err) {
    // колбэк выполнится, если getPassword завершится ошибкой
    alert(err.message)
  })

        
        
          
        
      

Как понять

Секция статьи "Как понять"

catch выполняет переданный ему колбэк когда асинхронная операция:

  • вызывает функцию reject внутри промиса
        
          
          const rejectInSecond = new Promise(function (resolve, reject) {  setTimeout(function () {    reject(new Error("время истекло"))  }, 1000)})rejectInSecond.catch(function (err) {  console.error(err.message) // напечатает в консоль «время истекло»})
          const rejectInSecond = new Promise(function (resolve, reject) {
  setTimeout(function () {
    reject(new Error("время истекло"))
  }, 1000)
})

rejectInSecond.catch(function (err) {
  console.error(err.message) // напечатает в консоль «время истекло»
})

        
        
          
        
      
  • выбрасывает ошибку с помощью throw
        
          
          const throwInSecond = new Promise(function (resolve, reject) {  setTimeout(function () {    throw new Error("время истекло")  }, 1000)})throwInSecond.catch(function (err) {  console.error(err.message) // напечатает в консоль «время истекло»})
          const throwInSecond = new Promise(function (resolve, reject) {
  setTimeout(function () {
    throw new Error("время истекло")
  }, 1000)
})

throwInSecond.catch(function (err) {
  console.error(err.message) // напечатает в консоль «время истекло»
})

        
        
          
        
      

🔧 Техническая деталь

Под капотом catch содержит вызов then, где первый колбэк установлен в undefine: catch(onReject)then(undefined, onReject).

На практике

Секция статьи "На практике"

Николай Лопин

Секция статьи "Николай Лопин"

🛠 Всегда завершайте свои цепочки промисов вызовом метода catch. Если в одной из операций в цепочке произойдёт ошибка, и она не будет обработана, то JavaScript выведет сообщение Uncaught (in promise) Error в консоль разработчика и перестанет работать на всей странице.