一、問題描述
今天在做一個RDB的小項目時,遇到一個問題,因為沒報錯其實也是不算是BUG,以下描述時我就直接說關鍵點,其他代碼忽略。
我的數據模型初始化有六條數據如圖
在持久化層,通過initUserData這個方法執行插入。
在頁面生命周期初始化
但是在運行項目后,初始加載第一次只有三條數據。
當把應用關掉不卸載再開一次,就有六條數據了
但是將應用卸載掉,重新運行項目第一次就又是三條數據了。當時百思不得其解,為什么第一次加載數據只有三條而且是固定三條,我想著是異步執行順序的問題,或數據庫關閉鏈接的問題。萬萬沒想到是foreach的問題。
二、解決辦法
通過網上查資料,發現forEach + async/await 是異步陷阱,原因就是:forEach 無法正確處理異步操作,它不會等待每個 await 完成就直接繼續執行后續代碼。
將循環插入那里的代碼改為:
然后不管是不是第一次加載都不會再出現加載數據不全的問題了。
三、重要結論
一句話,foreach 不要和async和await一起用,需要的話就用for …of…。