【Harmony_Bug】forEach + asyncawait 的异步陷阱

一、问题描述

今天在做一个RDB的小项目时,遇到一个问题,因为没报错其实也是不算是BUG,以下描述时我就直接说关键点,其他代码忽略。

我的数据模型初始化有六条数据如图

在持久化层,通过initUserData这个方法执行插入。

在页面生命周期初始化

但是在运行项目后,初始加载第一次只有三条数据。

当把应用关掉不卸载再开一次,就有六条数据了

但是将应用卸载掉,重新运行项目第一次就又是三条数据了。当时百思不得其解,为什么第一次加载数据只有三条而且是固定三条,我想着是异步执行顺序的问题,或数据库关闭链接的问题。万万没想到是foreach的问题。

二、解决办法

通过网上查资料,发现forEach + async/await 是异步陷阱 ,原因就是:forEach 无法正确处理异步操作 ,它不会等待每个 await 完成就直接继续执行后续代码。

将循环插入那里的代码改为:

然后不管是不是第一次加载都不会再出现加载数据不全的问题了。

三、重要结论

一句话,foreach 不要和async和await一起用,需要的话就用for ...of...。

相关推荐
oioihoii10 分钟前
C++11中的std::minmax与std::minmax_element:原理解析与实战
java·开发语言·c++
超龄超能程序猿10 分钟前
使用 Python 对本地图片进行图像分类
开发语言·人工智能·python·机器学习·分类·数据挖掘·scipy
wkj00115 分钟前
php中调用对象的方法可以使用array($object, ‘methodName‘)?
android·开发语言·php
hudawei99643 分钟前
kotlin中withContext,async,launch几种异步的区别
android·开发语言·kotlin
消失的旧时光-19431 小时前
Kotlin 常用语法糖完整整理
android·开发语言·kotlin
每次的天空1 小时前
Android-重学kotlin(协程源码第一阶段)新学习总结
开发语言·学习·kotlin
Dovis(誓平步青云)1 小时前
探索飞算 JavaAI 进阶:解锁高效Java开发的新维度
java·开发语言·飞算java
CS semi1 小时前
C++每日刷题day2025.7.10
开发语言·c++
还听珊瑚海吗1 小时前
Python(一)
开发语言·python
AI+程序员在路上2 小时前
Qt6中模态与非模态对话框区别
开发语言·c++·qt