记一次在forEach循环中使用异步代码无效

news2024/10/5 13:42:36

背景

代码如下:

const res1 = await getOrderPackage({
  XM_LX: "95", // 入院检查套餐
});
const res2 = await getOrderPackage({
  XM_LX: "98", // 入院检验套餐
});

const res = [...res1.data, ...res2.data]
let retList: any[] = [];
const map: Map<String, IOrderPackageDetail[]> = new Map();
res.forEach(async (e) => {
  const childRes = await getOrderPackageDetail({
    PACKAGE_ID: e.PACKAGE_ID,
  });
  map.set(e.PACKAGE_NAME, childRes.data);
})
console.log("map => ", map)
console.log("map.size => ", map.size)

运行结果:
在这里插入图片描述

原理分析

这段代码存在一个问题,即在使用 forEach 方法时,无法正常地处理异步操作和等待结果返回

forEach 方法本身是同步的,它不会再迭代过程中等待异步操作完成。在这段代码中,通过在 forEach 回调函数中使用 async 和 await 来尝试处理异步操作。然而,这并不会按照预期地工作。

forEach 方法不会等待异步操作完成,所以在 forEach 回调函数中使用 await 并不能保证在每个异步操作执行完成后在执行下一次循环。这意味着 map 的设置操作会在异步操作执行之前就已经完成,并且 map.size 可能为零,因为异步操作尚未完成。

解决问题

为了解决这个问题,可以使用 for…of循环 或 for循环来确保异步操作的按顺序执行,并等待所有异步操作完成后再执行后续逻辑。

const res1 = await getOrderPackage({
  XM_LX: "95", // 入院检查套餐
});
const res2 = await getOrderPackage({
  XM_LX: "98", // 入院检验套餐
});

const res = [...res1.data, ...res2.data]
let retList: any[] = [];
const map: Map<String, IOrderPackageDetail[]> = new Map();
for (let i = 0, len = res.length; i < len; i++) {
  const childRes = await getOrderPackageDetail({
    PACKAGE_ID: res[i].PACKAGE_ID,
  });
  map.set(res[i].PACKAGE_NAME, childRes.data);
}
console.log("map => ", map)
console.log("map.size => ", map.size)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/748479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一万字带你吃透RocketMQ

前言 工作中很多种场景下会用到消息队列&#xff0c;消息队列简单来说就是 消息的传输过程中保存消息的容器。消息队列主要解决了应用耦合、异步处理、流量削峰等问题。今天我们来了解一下阿里开源的一款产品 RocketMQ。 RocketMQ简介 RocketMQ 是一款低延迟、高并发、高可用…

SEM代运营费用解析:为什么值得投资?

随着企业竞争的日益激烈&#xff0c;SEM&#xff08;搜索引擎营销&#xff09;作为一种重要的数字营销手段&#xff0c;已经成为各类企业不可或缺的一部分。然而&#xff0c;在进行SEM代运营时&#xff0c;很多企业都会关心费用问题。本文将为您解析SEM代运营费用的组成和投资价…

React中的key有什么作用?

一、是什么 首先&#xff0c;先给出react组件中进行列表渲染的一个示例&#xff1a; const data [{ id: 0, name: abc },{ id: 1, name: def },{ id: 2, name: ghi },{ id: 3, name: jkl } ];const ListItem (props) > {return <li>{props.name}</li>; };co…

网络安全(黑客技术)自学笔记

首先给大家简单介绍一下网络安全&#xff1a; 1.什么是网络安全&#xff1f; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、…

【星戈瑞】荧光染料BODIPY-689/725激发发射应用

BODIPY-689/725是一种荧光染料&#xff0c;BODIPY具有强烈吸收和发射荧光的有机染料&#xff0c;常用于生物成像和荧光探针应用中&#xff0c;其激发和发射波长适合于深层组织和细胞内的成像,可应用于生物成像、荧光探针、传感器等领域。 产品名称&#xff1a;氟化硼二吡咯-68…

房屋结构安全监测方案,守护城市建筑的安全底线!

近年来&#xff0c;随着城市化进程的加速和建筑业的迅猛发展&#xff0c;房屋结构安全成为社会关注的焦点。房屋在长期使用的过程中可能遭受到各种自然原因逐渐老化、人为原因的损坏导致房屋基础结构产生老化、腐蚀、折断等险情&#xff0c;进而引发结构倾斜、位移、开裂、扭曲…

flink启动报错Failed to construct kafka producer

flink local模式下启动 sink2kafka报错&#xff0c;具体报错如下 apache.kafka.common.KafkaException: Failed to construct kafka producerat org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:432)at org.apache.kafka.clients.producer.…

【JDBC】Java连接MySQL数据库

文章目录 一、数据库编程二、Java数据库编程JDBC2.1 什么是JDBC2.2 JDBC的工作原理 三、JDBC基本操作3.1 JDBC API3.2 数据库连接Connection3.3 Statement对象3.4 ResultSet对象 四、应用案例 一、数据库编程 数据库编程指的是通过编程语言与数据库进行交互和操作的过程&#…

uniapp 一些常用的公共方法

封装代码可以看这篇文章: uniapp 封装公共方法(无需每个页面引用,直接可以调用)_前端小胡兔的博客-CSDN博客uniapp 封装公共方法https://blog.csdn.net/weixin_44805839/article/details/131684296?spm1001.2014.3001.5501 常用方法: 自定义返回页面 (直接使用uni.naviga…

DuiLib中的list控件以及ListContainerElement控件

文章目录 前言1、创建list控件2、创建 ListContainerElement 元素&#xff0c;并添加到 List 控件中,这里的ListContainerElement用xml来表示3、在 ListContainerElement 元素中添加子控件 1、List控件2、ListContainerElement控件 前言 在 Duilib 中&#xff0c;List 控件用于…

【微服务】集成其他已有的模块

目录 下载新的模块信息删除git信息将已有模块复制到当前项目里面在父pom文件中&#xff0c;加上复制进的模块重新解析结果 下载新的模块信息 删除git信息 将已有模块复制到当前项目里面 在父pom文件中&#xff0c;加上复制进的模块 重新解析 结果 集成完成

第二十四章:索引的数据结构

第二十四章&#xff1a;索引的数据结构 24.1&#xff1a;为什么使用索引 ​ 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教课书的目录部分&#xff0c;通过目录中找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道…

Java实现图片与Base64编码互转

Java实现图片与Base64编码互转 淘宝里面的html用base64转换图片&#xff0c;不知道为什么&#xff0c;不过看起来好像很美好&#xff0c;话不多说&#xff0c;直接上代码&#xff1a; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOE…

Effective Java笔记(6)避免创建不必要的对象

一般来说&#xff0c;最好能重用单个对象&#xff0c;而不是在每次需要 的时候就创建一个相同功能的新对象 。 重用方式既快速&#xff0c;又流行 。 如果对象是不可变的&#xff08; immutable ) &#xff08;详见第 17 条&#xff09;&#xff0c;它就始终可以被重用 。 作为…

Golang gui walk入门教程(一)安装walk环境

一、golang环境 Go 1.11.x or later 二、安装walk go get github.com/lxn/walk 三、安装rsrc 运行walk程序需要manifest&#xff0c;rsrc提供了这个功能 go install github.com/akavel/rsrc 安装完成后在GOPATH的bin下面会有一个rsrc.exe的可执行文件 在idea的termial输入r…

Tauri 提供界面 + 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

Tauri 提供界面 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令 文章目录 Tauri 提供界面 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令一、Tauri 概述二、界面预览三、代码参考1、main.rs2、App.vue3、Greet.vue4、依赖 一、Tauri 概述 Tauri 是一…

C语言动态获取设备的网络接口名称和状态以及对应的IP地址

一、目的 在实际项目中需要获取设备的IP地址然后通过广播的形式通知局域网内的其他设备。 二、介绍 方法一 通过ioctl方式获取SIOCGIFADDR信息 /** C Program to Get IP Address*/ #include <stdio.h> #include <string.h> #include <sys/types.h> #includ…

mfc120u.dll丢失修复,mfc120u.dll缺失的解决方法

MFC120u.dll缺失的原因 当系统中缺少或损坏了MFC120u.dll文件时&#xff0c;就会出现"MFC120u.dll缺失"的错误提示。造成MFC120u.dll缺失的原因可能有以下几种情况&#xff1a; 1.文件删除或损坏&#xff1a;MFC120u.dll文件可能因为误删除、病毒感染、硬盘故障等原…

pearsonr报错:计算结果为nan、warning .warn (stats.constantinputwarning (msg))

【1】两个都是ndarry 最后结果为nan&#xff1a; &#xff08;1&#xff09;数据类型转换&#xff1a;都转为一样的float32&#xff1a;依旧报错nan &#xff08;2&#xff09;进入函数内部debug&#xff1a; if (xx[0]).all() or (yy[0]).all() warning .warn (stats.consta…

13-接口、代码、命令如何测试?

可以通过工具&#xff0c;也可以通过代码来进行测试。 这里使用工具Postman。 1.针对接口进行测试 粘贴导入到Postman中&#xff1a; 也可直接复制URL&#xff1a; 粘贴到Postman中&#xff1a; 没有对应的参数&#xff0c;那么可以直接请求&#xff1a; 这个接口的GET、POST…