Клавиша / esc

.catch()

Обрабатываем ситуации, когда обещали, но не выполнили.

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

Кратко

Скопировано

Метод 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(), где первый колбэк установлен в undefined: catch(onReject)then(undefined, onReject).

На практике

Скопировано

Николай Лопин советует

Скопировано

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