javascript - async/await 中await接收的promise的問題
問題描述
在async/await中,await接收的需要是一個(gè)promise對(duì)象,那么我這樣寫:
async getAddressList () {this.list = await AreaSvr.getList(320100); }getAddressList().catch((err) => { ... });
AddressSvr.getList = function (pid) { return new Promise((resolve, reject) => { Vue._http.get(’area/get’, {pId: pid}).then( res => {resolve(res.Data); }, err => {reject(err); }); })};
這樣是沒有問題的,AreaSvr.getList中返回的是一個(gè)promise對(duì)象。現(xiàn)在我把AreaSvr.getList封裝一下,加一個(gè)緩存:
let areaList = [];AddressSvr.getAreaList = (level, pid) => {// 接收等級(jí)跟pid兩個(gè)參數(shù),如果已有areaList或者相關(guān)二級(jí)list,直接返回Promise.resolve(...) if (level === 1 && areaList.length !== 0) { return Promise.resolve(areaList) } else if (level === 2) { for (let i = 0; i < areaList.length; i++) { if (areaList[i].AreaId === pid && areaList[i].children.length !== 0) {return Promise.resolve(areaList[i].children) } } } // 這里對(duì)之前的http請(qǐng)求AddressSvr.getList進(jìn)行封裝,在獲取到相關(guān)值之后,進(jìn)行緩存并且返回 return new Promise(// 返回一個(gè)promise對(duì)象,讓await來接收 (resolve, reject) => { AddressSvr.getList(pid).then(res => { if (level === 1) { areaList = res;// 緩存areaList return resolve(areaList); //返回 } for (let i = 0; i < areaList.length; i++) { if (areaList[i].AreaId === pid) { areaList[i].children = res;// 緩存子列表 return resolve(areaList[i].children);// 返回 } }}, err => { reject(err);} ); } );};
async getAddressList () {this.list = await AreaSvr.getAreaList(1, 320100);//這里傳入等級(jí),使用加了緩存的函數(shù)if (this.list.length !== 0) { this.childList = await AreaSvr.getAreaList(2, this.list[0].AreaId);} }
在這里,我在AddressSvr.getList的外面封裝了一層promise做了緩存,這時(shí)候await接收的是AddressSvr.getAddressList 這個(gè)函數(shù)返回的promise了,但是這個(gè)時(shí)候返回的promise無效,直接catch到error了,請(qǐng)問一下我哪邊寫的有問題?
問題解答
回答1:如果直接catch了,說明寫法沒有問題,可能是業(yè)務(wù)部分出錯(cuò)了,可以把error信息貼出來看看
回答2:我在上面判斷是否有緩存的地方用的是areaList[i].children.length !== 0,這個(gè)時(shí)候還沒有children,是undefind,所以會(huì)報(bào)錯(cuò)。這個(gè)不是async/await的用法問題,是我自己寫錯(cuò)了。
相關(guān)文章:
1. java中返回一個(gè)對(duì)象,和輸出對(duì)像的值,意義在哪兒2. docker - 各位電腦上有多少個(gè)容器啊?容器一多,自己都搞混了,咋辦呢?3. python - pandas dataframe如何對(duì)某列的空數(shù)據(jù)位置進(jìn)行update?update的函數(shù)是自定義的,參數(shù)是同一行的另外兩列數(shù)據(jù)4. docker網(wǎng)絡(luò)端口映射,沒有方便點(diǎn)的操作方法么?5. docker start -a dockername 老是卡住,什么情況?6. css3 - 純css實(shí)現(xiàn)點(diǎn)擊特效7. apache web server 怎么限制某一個(gè)網(wǎng)站對(duì)服務(wù)器資源的占用?8. javascript - 關(guān)于apply()與call()的問題9. 安全性測(cè)試 - nodejs中如何防m(xù)ySQL注入10. html5 - 請(qǐng)問現(xiàn)在主流的前端自動(dòng)化構(gòu)建工具是哪個(gè)?
