Клавиша / esc

.catch()

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

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

Кратко

Скопировано

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

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

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

Как пишется

Скопировано
        
          
          // Асинхронная функция, которая возвращает промисgetPasswords()  .then(function (result) {    // Выполнится, если операция успешна  })  .catch(function (err) {    // Колбэк выполнится, если функция завершилась ошибкой    alert(err.message)  })
          // Асинхронная функция, которая возвращает промис
getPasswords()
  .then(function (result) {
    // Выполнится, если операция успешна
  })
  .catch(function (err) {
    // Колбэк выполнится, если функция завершилась ошибкой
    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(). Если в одной из операций в цепочке произойдёт ошибка, она не обработается и перестанет работать на всей странице. JavaScript выведет в консоль разработчика сообщение Uncaught (in promise) Error.