Bluebird.js: Re-Throwing the error in catch callback 没有被再次捕获
Bluebird.js: Re-Throwing the error in catch callback is not caught again
我想知道为什么在此示例中从未调用外部 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);
});
我试图再次抛出捕获到的错误,并且 return 被拒绝的 Promise 但在这两种情况下都没有调用外部回调。
谁能告诉我为什么?
使用 bluebird.js 3.0.2 的实时示例:
http://codepen.io/jjd/pen/wMqEpR?editors=001
编辑:我忘了在第 7 行中 return 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,我现在明白了这个问题。在 then() 中抛出错误将 return Promise.reject(err) 自动
Promise.reject() in then() 不会自动 return 这个 Promise.reject() 。
我们必须 return 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);
});
我想知道为什么在此示例中从未调用外部 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);
});
我试图再次抛出捕获到的错误,并且 return 被拒绝的 Promise 但在这两种情况下都没有调用外部回调。
谁能告诉我为什么?
使用 bluebird.js 3.0.2 的实时示例: http://codepen.io/jjd/pen/wMqEpR?editors=001
编辑:我忘了在第 7 行中 return 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,我现在明白了这个问题。在 then() 中抛出错误将 return Promise.reject(err) 自动 Promise.reject() in then() 不会自动 return 这个 Promise.reject() 。 我们必须 return 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);
});