如果我没记错的话Promise应该在任何时候抛出一个错误时捕获错误,以便Promise.catch()可以用来处理该错误。我不记得任何例外,但是当我在setTimeout()
内抛出错误时,这种方式无效。
有人可以解释为什么这不起作用?或者它只是NodeJS中的一个错误?
测试代码
// This works!
function async() {
return new Promise(function (resolve, reject) {
throw new Error('test');
});
}
async().catch(function() {
console.log('Ok: 1');
});
// This doesn't work..
function async_fail() {
return new Promise(function (resolve, reject) {
setTimeout(function() {
throw new Error('test');
}, 1);
});
}
async_fail().catch(function() {
console.log('Ok: 2');
});
答案 0 :(得分:0)
您永远不会捕获在setTimeout中引发的错误,因为它会对promise函数的实际执行执行异步。因此,当调用set timeout内的函数时,promise本身已经完成(没有任何调用解析或拒绝)。
如果你想根据setTimeout中的错误使承诺失败,你需要手动捕获它并调用reject:
setTimeout(function() {
try{
throw new Error('test');
}catch(ex){
reject(ex);
}
}, 1);