猿问

奇怪的 Unhandled promise rejection

如下代码,一直输出Unhandledpromiserejection(rejectionid:1):error1,怎么避免?
主要功能为getVal第一次调用预加载,第二次调用时没返回就等,返回了就直接取值
constrejects=[0,1]
leti=0
functiongetSummary(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=data
returndata
})
}elseif(this.summary.then){
returnawaitthis.summary
}
}catch(ex){
this.summary=null
}
returnthis.summary
}
}
newTest().test()
已解决见3楼如1楼所说,第一个getVal异常被上抛了,直接trycatch也不行,只能Await才行。只好去看await改成3楼的了
狐的传说
浏览 5686回答 2
2回答

米琪卡哇伊

是不是这个意思asyncgetVal(){try{if(!this.summary){//加上awaitthis.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}

森林海

当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);})关键点就是不要让异常上抛。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答