Рубрики
Без рубрики

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

Обещания – это одна из лучших вещей, которые произошли с JavaScript за последние несколько лет. Когда мы вызываем функцию, которая возвращает обещание, мы связываем метод then() обещания для запуска функции, когда обещание будет выполнено. Вот пример использования API выборки: fetch(‘/data.json’).затем (ответ => {консоль.журнал (ответ.статус)}) Что делать, если во время вызова fetch() произошла ошибка? Возможно, сеть недоступна. Или сетевой запрос возвращает ошибку.

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

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

Вот пример использования API выборки:

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

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

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

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

})

Внутри обещания нам передаются 2 параметра, 2 функции. Внутри тела, если все идет в поиск, вызывается функция 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() с затем() методом:

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)
  })

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

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

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

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

Оригинал: “https://flaviocopes.com/javascript-promises-rejection/”