一個典型的異步編程問題:即您嘗試在循環中發起多個異步請求,并希望在所有請求都完成后執行某些操作。然而,由于JavaScript的異步性質,num
和total
的比較在循環結束時立即執行,而不是在所有請求都完成后執行。這可能導致this.navList
在數據完全填充之前就被賦值。
為了優化這段代碼,您可以使用Promise.all
來等待所有異步請求完成。這里是如何實現的:
-
將循環中的異步請求封裝成Promise數組:為每個
navigatorID
創建一個Promise,該Promise在內部調用getAllMemberRecommendList
。 -
使用
Promise.all
等待所有Promise完成:一旦所有Promise都創建好了,使用Promise.all
來等待它們全部解決。 -
處理結果:在所有請求都完成后,處理結果并更新
this.navList
。getNavList() { getNavigatorList({ siteID: Common.siteID, navigatorID: Common.peoNavID, sortTypeOrder: 1, isValid: 1, isLock: 0, }, (res) => { if (res.data.header.code === 0) { const navList = res.data.body.data.rows; const promises = navList.map(item => { return new Promise((resolve, reject) => { getAllMemberRecommendList({ navigatorID: item.navigatorID, sortTypeTime: 2, isValid: 1, isLock: 0, pageNumber: 99, }, (res1) => { if (res1.data.header.code === 0) { item.memberPublishList = res1.data.body.data.rows; resolve(item); // 解析當前item } else { reject(new Error('Failed to fetch member recommend list for ' + item.navigatorID)); } }); }); }); Promise.all(promises) .then(updatedNavList => { this.navList = updatedNavList; console.log("導航", this.navList); }) .catch(error => { console.error('Error fetching data:', error); }); } }); }