catch拒绝promise有任何问题,并用错误代码将其转化为解决方案



我正在做一个项目,它总是捕捉被拒绝的承诺,并将其转化为带有错误代码的已解决承诺,比如这个

return new Promise((resolve, reject) => {
axios({
...
}).then(res => {
resolve(res);
}).catch(err => {
let res = { ... }
res.error = err
resolve(res)
})
})

然后每当调用这个api时,被拒绝的情况都会像这样处理,即没有捕获

axios_call(...).then(res => {
if (!res.err) {
//resolve case
} else {
//reject case
}
})

我以前从未处理过这样被拒绝的承诺,所以我不确定它会不会引起任何问题,或者它只是一种不同的代码风格,也可以正常工作。

我检查了可能重复的q/a什么是显式promise构造反模式,我如何避免它?但我相信他们不一样。因为我的问题是关于处理被拒绝的承诺,而这个问题是关于延期对象,例如,在我的情况下,错误和拒绝不会被接受。

首先,避免使用Promise构造函数反模式!您的axios_call代码最好看起来像这样:

return axios({
...
}).catch(err => {
return { ..., error: err };
});

然后无论何时调用此api,都会在没有catch的情况下处理被拒绝的情况。我以前从未处理过这样被拒绝的承诺,所以我不确定它会不会引起任何问题,或者它只是一种不同的代码风格,也可以正常工作。

它有效,但不好。这种错误处理风格很奇怪,而且非常不地道。它与具有单独errorresult参数的传统节点式回调API具有相同的问题:

  • promise不知道您是否处理了错误。您将不会收到任何未处理的拒绝警告
  • 不管是否需要,您总是必须编写代码来处理res.error。对于正常的promise用法,您可以只提供单独的onFulfillonReject回调,忽略后者将获得合理的默认行为,即转发错误,而不是删除它

我看不出你的风格会带来任何优势,所以我建议避免这种情况,并使用正常的承诺拒绝。

相关内容

最新更新