为了账号安全,请及时绑定邮箱和手机立即绑定

奇怪的 Unhandled promise rejection

奇怪的 Unhandled promise rejection

狐的传说 2019-05-12 15:35:35
如下代码,一直输出Unhandledpromiserejection(rejectionid:1):error1,怎么避免?主要功能为getVal第一次调用预加载,第二次调用时没返回就等,返回了就直接取值constrejects=[0,1]leti=0functiongetSummary(id){returnnewPromise((resolve,reject)=>{console.log('rr',id,i)if(rejects.includes(i)){setTimeout(()=>reject('error1'),200)}elseif(id===1){setTimeout(()=>resolve(id),200)}else{setTimeout(()=>resolve(id),500)}i++})}classTest{test(){this.getVal()setTimeout(async()=>{try{constval=awaitthis.getVal()console.log('get1',val)}catch(ex){console.log('error')}console.log('get2',awaitthis.getVal())},1000)}asyncgetVal(){try{if(!this.summary){this.summary=getSummary(1).catch(()=>getSummary(2)).then((data)=>{this.summary=datareturndata})}elseif(this.summary.then){returnawaitthis.summary}}catch(ex){this.summary=null}returnthis.summary}}newTest().test()已解决见3楼如1楼所说,第一个getVal异常被上抛了,直接trycatch也不行,只能Await才行。只好去看await改成3楼的了
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

是不是这个意思
asyncgetVal(){
try{
if(!this.summary){
//加上await
this.summary=awaitgetSummary(1).catch(()=>getSummary(2))
//后面的不要了
//.then((data)=>{
//this.summary=data;
//returndata;
//})
}elseif(this.summary.then){
returnawaitthis.summary
}
}catch(ex){
this.summary=null
}
returnthis.summary
}
                            
查看完整回答
1 反对 回复 2019-05-12
?
森林海

TA贡献2011条经验 获得超2个赞

当Promise的状态变为rejection时没有正确处理,让其一直冒泡(propagation),直至被进程捕获。这个Promise就被称为unhandledpromiserejection。
//方式一.then(undefined,()=>{})
newPromise((resolve,reject)=>{
//...
reject('timeout');
}).then(undefined,(error)=>{
console.error(error);
});
//方式二.catch(()=>{})
newPromise((resolve,reject)=>{
//...
reject('timeout')
}).catch((error)=>{
console.error(error);
})
关键点就是不要让异常上抛。
                            
查看完整回答
反对 回复 2019-05-12
  • 2 回答
  • 0 关注
  • 5685 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号