Bluebird - 如何在嵌套的promise中传播错误

时间:2016-05-09 08:59:45

标签: node.js promise bluebird

PromiseA().then(function(){
    PromiseB().catch(function (e) {
        throw e;
    })
}).catch(function (e) {
    // I want exceptions thrown in the nested promise chain to end up here.
})

如何从嵌套的promises中获取异常以冒泡到父承诺?

2 个答案:

答案 0 :(得分:3)

使用PromiseA().then(function(){ return PromiseB(); }).catch(function (e) { // I want exceptions thrown in the nested promise chain to end up here. }) 关键字

您的代码可以简化为:

PromiseA().then(function(){
    var myPromise = PromiseB().then...;
    return new Promise(function(resolve, reject){
      myPromise.catch(reject)
    })
}).catch(function (e) {
    // I want exceptions thrown in the nested promise chain to end up here.
})

修改

不确定这是否是正确的方法,但是如果涉及承诺取消并且您只想冒泡错误流,则可以将您的承诺包装在自定义的Promise中,它永远不会解析但会抛出错误(如果它发生):< / p>

/foo/:some_id/bar/:id

答案 1 :(得分:2)

首先,避免使用嵌套的promises。还总是使用return语句从嵌套函数返回promise结果。在您的示例中,永远不会使用PromiseB结果,并且在解析PromiseB之前将解析主承诺链。

在您目前的情况下,您可以使用Promise.reject函数将错误冒充到父承诺:

PromiseA()
    .then(function() {
        return PromiseB()
            .catch(function (err) {
                // TODO: error processing
                return Promise.reject(err);
            });
    })
    .catch(function(err) {
        // Here you'll get the same err object as in first catch
    });