被拒绝的承诺仍然会调用下一个.then()

时间:2017-08-08 18:53:31

标签: javascript node.js google-cloud-functions

这是一个拒绝100%的承诺链。我希望第一个console.log可以打印,但之后由于被拒绝的承诺,它应该跳到.catch最后

function stringProcessor(string)
{
    return new Promise((resolve, reject) => {
        console.log(`Calling ${string}`)
        reject(`Rejected ${string}`)
    });
}

exports.concat = functions.https.onRequest((request, response) => {
    return stringProcessor("foo")
    .then(stringProcessor("bar"))
    .then(stringProcessor("hello"))
    .then(response.send("no problem!"))
    .catch(e => 
    { 
        console.log("CAUGHT : " + e)
        response.send("not ok")
    })
})

但是输出日志是

info: User function triggered, starting execution
info: Calling foo
info: Calling bar
info: Calling hello
info: CAUGHT : Rejected foo
info: Execution took 15 ms, user function completed successfully
error: (node:67568) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Rejected bar
error: (node:67568) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:67568) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): Rejected hello

不仅一切都被顺序调用,即使CAUGHT线明确打印,我也被警告过未被捕获的承诺。

1 个答案:

答案 0 :(得分:6)

您需要传递在then中返回承诺的函数:

return stringProcessor("foo")
.then(() => stringProcessor("bar"))
.then(() => stringProcessor("hello"))
// ...

在你的例子中,你没有传递函数,而是承诺。