我想知道为什么在这个例子中永远不会调用外部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);
});
我试图再次抛出catch错误并返回一个被拒绝的Promise,但在这两种情况下都没有调用外部回调。
谁能告诉我为什么?
使用bluebird.js 3.0.2的实例 http://codepen.io/jjd/pen/wMqEpR?editors=001
编辑:我忘记在第7行返回returnPromise(),这就是代码无法正常工作的原因。
答案 0 :(得分:8)
被拒绝的承诺不是错误。您可以将错误转换为被拒绝的承诺 - 这就是您所做的:
.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);
});
答案 1 :(得分:0)
感谢@Tomalak,我现在明白了这个问题。在then()内部抛出错误将自动返回Promise.reject(错误) then()内的Promise.reject()不会自动返回此Promise.reject()。 我们必须明确地返回Promise.reject()
// 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);
});