Javascript 处理承诺中未预料到的错误,从而避免';t触发器拒绝()
在下面的javascript代码中,为什么承诺中的.catch()没有捕捉到错误(由对承诺中不存在的对象属性的赋值生成),而是被window.onunhandledrejection函数捕捉到?我希望能够使用.catch()捕获承诺中的错误,即使它们不是我事先想到的错误,因此也没有想到编写代码来显式调用reject()Javascript 处理承诺中未预料到的错误,从而避免';t触发器拒绝(),javascript,error-handling,promise,es6-promise,catch-block,Javascript,Error Handling,Promise,Es6 Promise,Catch Block,在下面的javascript代码中,为什么承诺中的.catch()没有捕捉到错误(由对承诺中不存在的对象属性的赋值生成),而是被window.onunhandledrejection函数捕捉到?我希望能够使用.catch()捕获承诺中的错误,即使它们不是我事先想到的错误,因此也没有想到编写代码来显式调用reject() 从新承诺(异步函数(…)中删除async,它将按预期工作。async正在捕获异常并将其转换为承诺不期望的被拒绝承诺。您向它传递一个函数,该函数返回一个它应该注意的承诺,这不是与n
从
新承诺(异步函数(…)
中删除async
,它将按预期工作。async
正在捕获异常并将其转换为承诺不期望的被拒绝承诺。您向它传递一个函数,该函数返回一个它应该注意的承诺,这不是与newpromise()
构造函数签订的合同的一部分
相反,Promise构造函数会捕获executor函数中的同步异常,或等待您调用resolve()
或reject()
回调,而不会关注executor回调函数返回的任何内容
您可以在这里看到,如果删除async
关键字,那么它将按预期工作,异常将在.catch()
中捕获
功能测试(){
返回新承诺(功能(解决、拒绝){
ObjectThatThatsNotExist.property=1;
} );
}
test().catch((error)=>{console.log(“catch”+error)})
…或者干脆省略新承诺
的内容,只编写异步函数测试(){objectThatDoesntExist.property=1;}
@Bergi-除了我认为问题的关键是为什么承诺构造函数在这种情况下没有给出期望的结果。所有这些信息对我都很有用(作为js的新手)谢谢。
window.onunhandledrejection = function( error ) {
console.log(error.reason);
};
function test() {
return new Promise( async function( resolve, reject ) {
objectThatDoesntExist.property = 1;
} );
}
test().catch( (error) => { console.log("Caught " + error) } );