Bluebird.js:重新抛出catch回调中的错误不再被捕获

Jes*_*sse 3 javascript error-handling promise bluebird

我想知道为什么在这个例子中永远不会调用外部catch回调:

var returnPromise = function () {
  return new Promise(function (resolve, reject) {
      resolve('promise return value');
  })
};
returnPromise().then(function () {
    returnPromise().then(function() {
        throw new Error('hello');
    }).catch(function (err) {
        console.log('got inner error', err);
        return Promise.reject(err);
        //throw err;
    });
}).catch(function (err) {
  console.log('got outer error', err);
});
Run Code Online (Sandbox Code Playgroud)

我试图再次抛出catch错误并返回一个被拒绝的Promise,但在这两种情况下都不会调用外部回调.

谁能告诉我为什么?

使用bluebird.js 3.0.2的实例:http://codepen.io/jjd/pen/wMqEpR?edit = 001

编辑:我忘了在第7行返回returnPromise(),这就是代码无法按预期工作的原因.

Tom*_*lak 8

被拒绝的承诺不是错误.您可以将错误转换为被拒绝的承诺 - 这就是您所做的:

.catch(function (err) {
    return Promise.reject(err);
});
Run Code Online (Sandbox Code Playgroud)

之后,它不再是一个错误的条件.如果您想要一个错误条件,请不要捕获并拒绝.

function returnPromise() {
    return Promise.resolve('promise return value');
}

returnPromise().then(function () {
    return returnPromise().then(function () {
        throw new Error("failed");
    })
}).catch(function (err) {
    console.error("Outer: " + err);
});
Run Code Online (Sandbox Code Playgroud)

如果你的catch处理程序只是做了一些日志记录而你想保留错误,那么只需重新抛出它.

returnPromise().then(function () {
    return returnPromise().then(function () {
        throw new Error("failed");
    }).catch(function (err) {
        console.error("Inner: " + err);
        throw err;  // or new Error('...')
    });
}).catch(function (err) {
    console.error("Outer: " + err);
});
Run Code Online (Sandbox Code Playgroud)