捕获拒绝承诺并用错误代码将其转换为解决任何问题?

时间:2019-01-18 10:05:19

标签: javascript node.js promise try-catch es6-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
        }
    })

我以前从未像这样处理过被拒绝的承诺,所以我不确定这是否会引起任何问题,或者它只是一种不同的代码样式,而且效果很好。

我检查了可能重复的{/ {3}} 但是我相信他们不一样。因为我的问题是关于处理被拒绝的承诺,而这个问题是关于延期的对象,例如对于我而言,错误和拒绝不会被吞没。

1 个答案:

答案 0 :(得分:1)

首先,避免使用Promise constructor antipattern!您的axios_call代码最好看起来像这样:

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

然后,每当调用此api时,都将不使用catch处理被拒绝的案例。我以前从未像这样处理过被拒绝的承诺,所以我不确定这是否会引起任何问题,或者它只是一种不同的代码样式,并且也可以正常工作。

它可以工作,但是不好。这种错误处理方式很奇怪,而且真的很惯用。它具有与带有单独的errorresult参数的传统节点样式回调API相同的问题:

  • promise无法知道您是否处理了错误。您不会收到任何未处理的拒绝警告。
  • 无论是否需要,您始终必须编写代码来处理res.error。使用正常的Promise用法,您可以仅提供单独的onFulfillonReject回调,而省略后者将为您提供转发错误而不是直接删除错误的明智默认行为。

我看不到您的样式会带来的任何优势,因此建议您避免使用它,并使用常规的Promise拒绝。