我想要做的是在链中背靠背执行一些同步/异步功能 - 如果不对 - 拒绝此功能,最后在catch
方法中捕获此拒绝的链,只是为用户抛出一个例外。我正在编写一个模块,如果他/她不正确地配置模块,我希望用户抛出一些消息。
当我尝试在Promise catch
方法中抛出一个错误时,它会返回UnhandledPromiseRejectionWarning: Unhandled promise rejection
异常。
正如我发现的那样,JS'throw
同样对待reject()
并且它期望在下一个链的末尾附加另一个catch
方法来“捕获”这个抛出的错误,什么对我来说似乎有些过分,或者我可能没有得到承诺的想法......
test()
.then(()=>{
console.log('success!');
})
.catch((msg)=>{
throw new Error(msg);
});
//it expects another catch here to 'catch' the thrown error
//if I attach another catch() here
//then the 'UnhandledPromiseRejectionWarning' is not displayed
//but Error is still not thrown, just caught by another catch()
function test(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
reject('you set incorrect type!');
},300);
});
}
我可以直接在Promise对象中抛出一个错误,以便抛出异常并按我的意愿终止链流,但我发现有点令人困惑的是我只能异步使用throw
在Promise对象中抛出异常。如果我throw
同步,Promise catch()
方法会捕获此异常。
抛出错误:(这是可取的)
function test(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
throw new Error('async aborted!');
},300);
});
}
执行Promise catch()
:(不可取)
function test(){
return new Promise((resolve,reject)=>{
throw new Error('sync aborted!');
setTimeout(()=>{
},300);
});
}
所以,总结一下,我试着弄清楚如何在不获得UnhandledPromiseRejectionWarning: Unhandled promise rejection
异常的情况下抛出错误?
在try catch
块中我可以简单地重新抛出异常,为什么我不能在Promise链中这样做?