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

2023-11-08

背景

代码如下:

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)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次在forEach循环中使用异步代码无效 的相关文章

随机推荐

  • java压缩文本内容

    java压缩文本内容工具类如下 package com my util import java io ByteArrayInputStream import java io ByteArrayOutputStream import java
  • 【压测系】1.apifox 自动化压测示例

    作为后端程序员 之前使用过的接口调试工具postMan restclient等 近期看到csdn右边的小广告弹窗 我这边无意之间点击打开下载之后 被它的很多功能一下子 吸引住了 比如有压测工具的功能 自动化测试 团队协作 重要的是不收费 为
  • mysql基础,快来复习一波!

    mysql基础 快来复习一波 一 数据库服务的启动与登录 1 1 通过服务的方式启动 1 2 手动启动的方式 1 3 控制台连接数据库 1 3 1 登录格式1 u和p后面没有空格 1 3 2登录格式2 1 3 3 登录格式3 1 3 4退出
  • 49天精通Java,第12天,Java接口的作用和意义

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于Java基础教程 入门篇 包含面向对象 基本数据类型 数
  • vue 自定义函数

    vue 自定义函数 存储localStorage export const setStore name content gt if name return if typeof content string content JSON stri
  • Chisel基础之Scala

    前言 Scala is yet another programming language which supports common programming paradigms We chose to use it for several
  • 格式装换到OFD

    https www yozodcs com page example html
  • 【6月第一周学习记录】Utrecht University Game&Media Technology-Computer vision计算机视觉(0):一点Linear Algebra基础

    1 Matrix rotation and translation 矩阵四则运算和平移旋转 2 homogeneous coordinates geomatric operations 齐次坐标系中的一些几何变换操作方法 平移和缩放 剪切变
  • laravel8框架-语言包的安装和配置

    1 查找 laravel框架语言包地址 根目录 resources lang 默认有个 en 语言包 2 下载 和 安装 下载地址 https packagist org 搜索 laravel lang 参考网址 https packagi
  • Spring MVC教程第一篇

    转自 Spring MVC教程第一篇 Spring MVC是Java平台下的一个框架 Spring MVC是一个开源框架 它用于开发Java Web应用程序 Spring框架由Rod Johnson编写 在2003年6月采用Apache 2
  • 西米支付:微信支付接口(申请与介绍)

    据统计 2022年微信全球用户数超12 8亿 其中微信支付使用人数达到6亿 而且微信支付在中国移动支付的市场份额超过40 无论是在线上购物 还是线下收款 都能看到微信支付的身影 微信支付已经融入到我们的日常生活中 所以 商家在接入支付接口的
  • 【Linux】linux系统很卡排除

    1 背景 今天操作linux感觉有点卡 然后就去排查 1 1 查看内存使用情况 root localhost dataMocker free g total used free shared buff cache available Mem
  • vscode html文件自动补充html骨架失效

    vscode html文件自动补充html骨架失效 输入 Tab键补全html骨架失效 解决办法 1 让html文件处于编辑状态 按下快捷键ctrl shift p 2 在跳转的对话框里面输入change language mode 在下拉
  • 什么是动态库?什么又是静态库?(如何生成/如何使用 ! ! !)

    动态库 静态库 目录 一 gcc g 的链接方式 1 动态链接 2 静态链接 二 库的优缺点 1 动态库的优点 2 静态库的优点 三 库的生成 四 库的使用 目录 一 gcc g 的链接方式 对于我们编译一段程序经常会需要调用一个函数库 就
  • 浅谈对于servlet的见解

    众所周知 我们创建一个javaweb项目后 在客户端想要访问服务器 得发起http请求 服务器对请求会进行响应 看似简单的请求和响应有很大的门道 虽然我们都会用servlet但是不乏有人不懂其中的原理 接下来我就浅谈一下servlet的一些
  • 获取当前IP地址,跳转到对应城市网站。

    博客迁移 时空蚂蚁http cui cuihongbo com 1 代码 index php
  • COCO-stuff用法

    COCO stuff API 1 是 COCO API 2 的扩展 安装见 3 这里研究一下 COCO stuff 的用法 Files 下载链见 4 image 训练集图片 train2017 zip 验证集图片 val2017 zip 分
  • Vue+ElementUI实现将数据库中的数字展示成对应汉字

    需求 数据库中存的是数字类型 需要展示成对应的汉字 其中 1 gt 部级 2 gt 省级 3 gt 市级 4 gt 其他 dvIdxIndexList里面是从后台查到的结果集 我们首直接用map遍历后台返回的结果集 利用里面的回调对数据进行
  • 在windows10的系统下安装MySQL

    简单介绍一下 Mysql workbench的安装教程 官方网址 https www mysql com downloads 下拉到最下面 点击进去 下载这两个软件 分别是 mysql的具体网址 https dev mysql com do
  • 记一次在forEach循环中使用异步代码无效

    背景 代码如下 const res1 await getOrderPackage XM LX 95 入院检查套餐 const res2 await getOrderPackage XM LX 98 入院检验套餐 const res res1