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

Bluebird.js: Re-Throwing the error in catch callback is not caught again

本文关键字:错误 js 新抛出 catch 回调 Bluebird      更新时间:2023-09-26

我想知道为什么在这个例子中从未调用外部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);
});

我试图再次抛出捕获的错误,并返回一个被拒绝的Promise,但在这两种情况下都没有调用外部回调。

有人能告诉我为什么吗?

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

EDIT:我忘记在第7行返回returnPromise(),这就是为什么代码不能按预期工作的原因。

被拒绝的承诺不是错误。你可以把一个错误变成一个被拒绝的承诺——这就是你在中所做的

.catch(function (err) {
    return Promise.reject(err);
});

在那之后,它不再是一个错误条件。如果你想要一个错误条件,不要捕获并拒绝。

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);
});

如果您的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);
});

感谢@Tomalak,我现在理解了这个问题。Throw error in then()将自动返回Promise.reject(err)then()内部的Promise.rejectt()不会自动返回此Promise.request()。我们必须显式返回Promise.rejectt()

// Caught
Promise.resolve(10)
  .then(() => {
    throw new Error("hello"); // Auto return a reject promise
  })
  .catch(err => {
    console.log(err);
  });
// Uncaught error
Promise.resolve(10)
  .then(() => {
    Promise.reject("hello"); // Error happens => no catch happen
  })
  .catch(err => {
    console.log(err);
  });
// Caught
Promise.resolve(10)
  .then(() => {
    return Promise.reject("hello"); // Explicit return Promise.reject()
  })
  .catch(err => {
    console.log(err);
  });