代码之家  ›  专栏  ›  技术社区  ›  Qiulang

捕获被拒绝的承诺并用错误代码解决它有什么问题吗?

  •  0
  • Qiulang  · 技术社区  · 7 年前

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

    然后每当调用这个api时,被拒绝的case都是这样处理的,即没有catch

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

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

    我检查了可能的重复q/a What is the explicit promise construction antipattern and how do I avoid it? 但我相信他们不一样。因为我的问题是关于处理被拒绝的承诺,而这个问题是关于延迟的对象,例如错误和拒绝在我的情况下是不可接受的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bergi    7 年前

    首先,避免 Promise constructor antipattern ! 你的 axios_call 代码最好如下所示:

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

    然后每当调用这个api时,被拒绝的案例在没有 catch . 我以前从未处理过这样被拒绝的承诺,所以我不确定它是否会导致任何问题,或者它只是一种不同的代码风格,工作也很好。

    它起作用了,但不好。这种错误处理方式很奇怪,而且非常不地道。它与传统的节点式回调API有相同的问题 error result 参数:

    • 未处理的拒绝
    • 您必须始终编写代码来处理 res.error ,如果你想不想。如果使用正常的承诺,您可以单独提供 onFulfill onReject 回调和省略后者将使您获得转发错误而不是仅仅删除错误的合理默认行为。

    我看不出你的风格会带来什么好处,所以我建议你避免它,使用正常的承诺拒绝。

    推荐文章