In async/await muss das Warten ein Versprechensobjekt empfangen, also schreibe ich so:
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);
});
})
};
Das ist kein Problem, AreaSvr.getList gibt ein Promise-Objekt zurück. Jetzt kapsele ich AreaSvr.getList und füge einen Cache hinzu:
let areaList = [];
AddressSvr.getAreaList = (level, pid) => {
// 接收等级跟pid两个参数,如果已有areaList或者相关二级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)
}
}
}
// 这里对之前的http请求AddressSvr.getList进行封装,在获取到相关值之后,进行缓存并且返回
return new Promise(// 返回一个promise对象,让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);//这里传入等级,使用加了缓存的函数
if (this.list.length !== 0) {
this.childList = await AreaSvr.getAreaList(2, this.list[0].AreaId);
}
}
Hier habe ich eine Versprechensschicht außerhalb von AddressSvr.getList zum Zwischenspeichern eingekapselt. Zu diesem Zeitpunkt empfängt das Versprechen, das von der Funktion AddressSvr.getAddressList zurückgegeben wird, jedoch ungültig und der Fehler kann direkt abgefangen werden Sag mir bitte, wo ich etwas falsch geschrieben habe?
如果直接catch了,说明写法没有问题,可能是业务部分出错了,可以把error信息贴出来看看
我在上面判断是否有缓存的地方用的是areaList[i].children.length !== 0,这个时候还没有children,是undefind,所以会报错。这个不是async/await的用法问题,是我自己写错了。