Dalam async/menunggu, apa yang menanti perlu diterima ialah objek janji, jadi saya menulis seperti ini:
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);
});
})
};
Tiada masalah dengan ini. AreaSvr.getList mengembalikan objek janji. Sekarang saya merangkum AreaSvr.getList dan menambah cache:
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);
}
}
Di sini, saya merangkumkan lapisan janji di luar AddressSvr.getList pada masa ini, tunggu menerima janji yang dikembalikan oleh fungsi AddressSvr.getAddressList Walau bagaimanapun, janji yang dikembalikan pada masa ini adalah tidak sah dan ralat boleh ditangkap awak tolong beritahu saya di mana saya menulis sesuatu yang salah?
Kalau kena tangkap terus maknanya tak ada masalah dengan cara penulisan Mungkin ada ralat di bahagian perniagaan Anda boleh hantar maklumat ralat dan lihat
Saya menggunakan areaList[i].children.length !== 0 untuk menentukan sama ada terdapat cache di atas pada masa ini, belum ada kanak-kanak dan ia tidak dapat ditentukan, jadi ralat akan dilaporkan. Ini bukan masalah penggunaan async/wait, ia adalah kesilapan yang saya buat.