【发布时间】:2019-09-12 23:13:11
【问题描述】:
我有一个名为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(...) 处理程序链的执行,因为它们只是无限地等待该 Promise解决。这样做是为了处理某些具有通用响应处理的 API 响应(例如代码 >= 500 的响应)。
问题是现在我需要调用.finally()(就像在 Vue 食谱中 - https://vuejs.org/v2/cookbook/using-axios-to-consume-apis.html#Dealing-with-Errors)来恢复某些组件的状态,不管是否有错误,但是这种挂起 Promise 的方法是一个障碍。
问题是:是否可以跳过此类处理程序之一中的所有后续.then(...) 和.catch(...) 调用以直接转到.finally()?
更新。我没有提到重要的一点 - api.onSuccess 和 api.onError 是 basic 处理程序。在另一个应用程序组件中,附加处理程序附加到request 函数中呈现的基本链的末尾。一些 API 调用的通常链具有以下结果形式:
return axios.request(endpoint).then(api.onSuccess).catch(api.onError).then((response) => {...}).catch(() => {...}).finally(() => {...})
(有时没有.finally() 或.catch(...) 块)
【问题讨论】:
-
api.onSuccess和api.onError的作用是什么?从这里看起来他们所做的只是让request的正确使用变得困难。 -
@TJCrowder 它们是初始处理程序 - 即
api.onError检查响应是否具有代码 >= 500,如果是,则将breakChain标志设置为true作为这种情况(代码 >= 500 ) 在整个应用程序中具有通用处理 -
@RomanYakubovich 您可以随时编写自己的
Promise-like 并实现所有花哨的东西。 (甚至不需要符合标准。)
标签: javascript vue.js promise