如果我没记错的话,Promises应该总是在抛出一个错误时捕获一个错误,以便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');
});
最佳答案
您将永远不会捕获setTimeout中引发的错误,因为它会执行与promise函数的实际执行异步的操作。因此,在设置超时内的函数被调用时,promise本身已经完成(没有任何调用来解决或拒绝)。
如果您希望基于在setTimeout中的错误而使 promise 失败,则需要手动捕获它并调用拒绝:
setTimeout(function() {
try{
throw new Error('test');
}catch(ex){
reject(ex);
}
}, 1);
关于javascript - promise 没有正确捕获错误NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40521242/