Обещания – это одна из лучших вещей, которые произошли с 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/”