Как справиться с отклонением обещаний

Обещания- одна из лучших вещей, которые произошли с JavaScript за последние несколько лет.

Когда мы вызываем функцию, которая возвращает обещание, мы связываемthen()метод обещания запустить функцию, когда обещаниерешает.

Вот пример использованияПолучить API:

fetch('/data.json')
  .then(response => { 
    console.log(response.status)
  })

Что делать, если во времяfetch()вызов? Возможно сеть недоступна. Или сетевой запрос возвращает ошибку.

Обещание отклонят. Обещание будет выглядеть примерно так:

const thePromise = new Promise((resolve, reject) => {

})

Внутри обещания нам передаются 2 параметра, 2 функции. Внутри тела, если все идет find, вызывается функция resolve ():

const thePromise = new Promise((resolve, reject) => {
  resolve('ok') //you can pass any value
})

Если происходит что-то плохое, вызывается функция reject ():

const thePromise = new Promise((resolve, reject) => {
  reject('error message') //you can pass any value
})

Если что-то пойдет не так, мы должны обработать отказ от обещания. Мы делаем это с помощьюcatch()метод обещания:

thePromise
  .catch(error => {
    console.error(error)
  })

Мы всегда должны добавлятьcatch(), иначе обещания будутмолча потерпеть неудачу.

Мы можем связатьcatch()кthen()метод:

thePromise
  .then(response => { 
    console.log(response)
  })
  .catch(error => {
    console.error(error)
  })

Или даже несколько, если у вас есть цепочка обещаний:

const thePromise = new Promise((resolve, reject) => {
  resolve({
    doSomething: function() {
      return new Promise((resolve, reject) => {
        reject('error!') //you can pass any value
      })
    }
  })
})

thePromise .then(response => { return response.doSomething() }) .then(response => { console.log(response) }) .catch(error => { console.log(error) })

В этом случае, еслиthePromiseотклоняется, выполнение переходит непосредственно кcatch()метод.

Вы можете добавитьcatch()метод посередине двухthen()методы, но вы не сможете разорвать цепочку, когда произойдет что-то плохое. И возвращаемое значениеcatch()(который будет иметьundefinedзначение, если не указано) будет передано следующемуthen().

На мой взгляд, лучше всего уйтиcatch()в конце цепочки и использовать его для обработки всех возможных ошибок.

На мой взгляд, обработка ошибок лучше всего васинхронный / ожидание, но иногда мы не можем избежать использования обещаний, вот как это можно сделать.

Скачать мою бесплатнуюРуководство для начинающих по JavaScript


Больше руководств по js: