一、问题描述
今天在做一个RDB的小项目时,遇到一个问题,因为没报错其实也是不算是BUG,以下描述时我就直接说关键点,其他代码忽略。
我的数据模型初始化有六条数据如图
在持久化层,通过initUserData这个方法执行插入。
在页面生命周期初始化
但是在运行项目后,初始加载第一次只有三条数据。
当把应用关掉不卸载再开一次,就有六条数据了
但是将应用卸载掉,重新运行项目第一次就又是三条数据了。当时百思不得其解,为什么第一次加载数据只有三条而且是固定三条,我想着是异步执行顺序的问题,或数据库关闭链接的问题。万万没想到是foreach的问题。
二、解决办法
通过网上查资料,发现forEach + async/await 是异步陷阱,原因就是:forEach 无法正确处理异步操作,它不会等待每个 await 完成就直接继续执行后续代码。
将循环插入那里的代码改为:
然后不管是不是第一次加载都不会再出现加载数据不全的问题了。
三、重要结论
一句话,foreach 不要和async和await一起用,需要的话就用for …of…。