如下代码,一直输出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){//加上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}

森林海
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);})关键点就是不要让异常上抛。
添加回答
举报
0/150
提交
取消