是否有可能在Promises中出现错误?
请参阅下面的代码以供参考,我希望promise1.catch
能够捕获promise2
中生成的错误(当前不能使用此代码):
function test() {
var promise1 = new Promise(function(resolve1) {
var promise2 = new Promise(function(resolve2) {
throw new Error('Error in promise2!');
});
promise2.catch(function(error2) {
console.log('Caught at error2', error2);
});
});
promise1.catch(function(error1) {
console.log('Caught at error1', error1);
});
}
test();
答案 0 :(得分:6)
Promises中的错误传播是其最强大的诉讼之一。它的行为与同步代码完全相同。
try {
throw new Error("Hello");
} catch (e){
console.log('Caught here, when you catch an error it is handled');
}
非常相似:
Promise.try(function(){
throw new Error("Hello");
}).catch(function(e){
console.log('Caught here, when you catch an error it is handled');
});
就像在顺序代码中一样,如果你想对错误做一些逻辑而不是将其标记为已处理 - 你需要重新抛出它:
try {
throw new Error("Hello");
} catch (e){
console.log('Caught here, when you catch an error it is handled');
throw e; // mark the code as in exceptional state
}
哪个成为:
var p = Promise.try(function(){
throw new Error("Hello");
}).catch(function(e){
console.log('Caught here, when you catch an error it is handled');
throw e; // mark the promise as still rejected, after handling it.
});
p.catch(function(e){
// handle the exception
});
请注意,在Bluebird中你可以有类型和条件捕获,所以如果你所做的就是承诺的类型或内容的if
来决定是否处理它 - 你可以保存
var p = Promise.try(function(){
throw new IOError("Hello");
}).catch(IOError, function(e){
console.log('Only handle IOError, do not handle syntax errors');
});
您还可以使用.error
来处理源自promisified API的OperationalError
。通常,OperationalError
表示您可以从中恢复的错误(与程序员错误相比)。例如:
var p = Promise.try(function(){
throw new Promise.OperationalError("Lol");
}).error(function(e){
console.log('Only handle operational errors');
});
这样做的好处是不会在代码中隐藏TypeError
或语法错误,这在JavaScript中会很烦人。