由promise对象的错误链混淆

时间:2015-11-20 03:28:52

标签: javascript node.js promise

我在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()

1 个答案:

答案 0 :(得分: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;