【Harmony_Bug】forEach + asyncawait 的异步陷阱

一、问题描述

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

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

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

在页面生命周期初始化

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

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

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

二、解决办法

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

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

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

三、重要结论

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

相关推荐
小糖学代码1 天前
LLM系列:1.python入门:15.JSON 数据处理与操作
开发语言·python·json·aigc
handler011 天前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
小白学大数据1 天前
现代Python爬虫开发范式:基于Asyncio的高可用架构实战
开发语言·爬虫·python·架构
渔舟小调1 天前
P19 | 前端加密通信层 pikachuNetwork.js 完整实现
开发语言·前端·javascript
不爱吃炸鸡柳1 天前
数据结构精讲:树 → 二叉树 → 堆 从入门到实战
开发语言·数据结构
网络安全许木1 天前
自学渗透测试第21天(基础命令复盘与DVWA熟悉)
开发语言·网络安全·渗透测试·php
t***5441 天前
如何在Dev-C++中使用Clang编译器
开发语言·c++
码界筑梦坊1 天前
93-基于Python的中药药材数据可视化分析系统
开发语言·python·信息可视化
Huanzhi_Lin1 天前
Laya导出的鸿蒙NEXT工程目录说明
华为·harmonyos·鸿蒙·laya·deveco·devecostudio·layaair
积水成渊,蛟龙生焉1 天前
鸿蒙手势处理篇(滑动冲突、基础手势、组合手势)
华为·arkts·鸿蒙·滑动冲突·手势冲突·基础手势·组合手势