【问题标题】:Confusing by promise object's error chain [duplicate]被承诺对象的错误链混淆[重复]
【发布时间】:2016-02-22 10:57:05
【问题描述】:

我在 node.js 中使用 promise 对象。我有一个对象:

var Send = {
    send(post_ids) {
        return Post.findById(post_ids)
            .then((posts) => {
                return sendArticlesToWechat(setupArticles(posts)); // sendArticlesToWechat is also a promise
            })
            .then((result) => {
                console.log("RESULT: " + result);
            })
            .catch((err) => {
                console.error("SEND ERROR: " + err);
                return err;
            });
        },
}

export default Send;

并在另一个文件中调用它的方法:

Send.send(req.body)
    .then((result) => {
        console.log("CALL SEND: " + result);
    })
    .catch((err) => {
        console.error(err);
    });

发生错误时,我得到两个输出:

SEND ERROR: ERROR: // error message
CALL SEND: ERROR: // error message

此错误发生在返回的sendArticlesToWechat() 函数中。因为这也是一个承诺,所以我可以在外面catch 它的错误。这是我所期望的。

当我调用Send.send() 时,我预计会在catch() 中得到错误,但错误出现在then() 方法中。

根据输出,错误确实是从之前的catch()返回的,为什么我不能保留在catch()中?

【问题讨论】:

    标签: javascript node.js promise


    【解决方案1】:

    问题出在您的最终catch() 中。因为你return err,你导致承诺被解决而不是被拒绝。如果你想返回一个被拒绝的承诺,那么要么删除catch(),要么重新抛出err

    var Send = {
        send(post_ids) {
            return Post.findById(post_ids)
                .then((posts) => {
                    return sendArticlesToWechat(setupArticles(posts)); // sendArticlesToWechat is also a promise
                })
                .then((result) => {
                    console.log("RESULT: " + result);
                })
                .catch((err) => {
                    console.error("SEND ERROR: " + err);
                    //return err;//converts from reject to resolved
                    throw err;
                });
            },
    }
    
    export default Send;
    

    【讨论】:

    • 是的,它有效。谢谢。那么你觉得哪一个更好呢?删除 catch()throw err?
    • 这可能会有所不同,但在这种情况下,我会选择throw err。我会在您的Send 对象中进行日志记录,以防调用代码忘记编写catch()。这样至少日志会显示发生了错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2021-01-19
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多