У меня есть функция с именем request
:
function request (endpoint) {
return axios.request(endpoint).then(api.onSuccess).catch(api.onError)
}
api.onSuccess
:
onSuccess (response) {
let breakChain = false
... some logic goes here ...
return breakChain ? (new Promise(() => {})) : response
}
api.onError
:
onError (error) {
let breakChain = false
... some logic goes here ...
if (breakChain) {
return new Promise(() => {})
} else {
throw error
}
}
api
содержит множество функций, которые представляют различные вызовы API на основе предоставленных данных конечных точек и возвращают request(endpoint)
.
В настоящее время, как вы видите, у меня есть код, который возвращает Promise с пустым исполнителем, который всегда находится в состоянии ожидания, чтобы остановить цепочку последующих обработчиков .then(...)
и .catch(...)
, поскольку они просто бесконечно ждут, пока это обещание селиться. Это делается для обработки определенных ответов API, которые имеют общую обработку ответов (например, ответы с кодом> = 500).
Проблема в том, что теперь мне нужен вызов .finally()
(как в Vue cookbook - https://vuejs.org/v2/cookbook/using-axios-to-consume-apis.html#Dealing-with-Errors), чтобы восстановить состояние какого-либо компонента, независимо от того, есть ли ошибка или нет, но этот подход в ожидании Promise является препятствием.
Вопрос в том, можно ли пропустить все последующие вызовы .then(...)
и .catch(...)
в одном из таких обработчиков, чтобы перейти непосредственно к .finally()
?
Обновление. Я не упомянул важный бит - api.onSuccess
и api.onError
являются базовыми обработчиками. В других компонентах приложения есть дополнительные обработчики, добавленные в конец этой базовой цепочки, представленной в функции request
. Обычная цепочка некоторых вызовов API имеет следующую результирующую форму:
return axios.request(endpoint).then(api.onSuccess).catch(api.onError).then((response) => {...}).catch(() => {...}).finally(() => {...})
(иногда нет блока .finally()
или .catch(...)
)