记一次在forEach中使用aynac/await中的坑

一次,foreach,使用,aynac,await · 浏览次数 : 22

小编点评

1.问题原因:`forEach` 方法只会遍历数组中的每个元素,不会进行异步操作,因此无法使用 `async/await` 来等待异步操作完成。 2.为什么出现这个问题?`forEach` 方法只是遍历数组中的每个元素,不会进行异步操作,所以对于某一次请求有等待过程,但对于整体的多次请求没有作用的。 3.延伸问题:由于 `forEach` 方法只能执行同步操作,所以无法使用 `async/await` 来等待异步操作完成。由于 `map` 方法会返回新数组,所以可以使用 `async/await` 来等待异步操作完成,并在映射数组中获取结果。

正文

1.背景

在写一个对齐脚本时 发现下列问题

   const timeList = await imageList.map( (item,index)=>{
        return  item.identify_border(start_time, end_time)
    })
// timeList = [Promise,Promise,Promise,Promise] 取不到timeList中的值

so 用普通的for循环试了一遍

 const timeList = []
  for(let i=0;i<imageList.length;i++){
    const time =await imageList[i].identify_border(start_time, end_time)
    timeList.push(time)
  }
// timeList = [ { },{ },{ },{ },{ } ]  能取到timeList中的值

2.为什么出现这个问题

  • 原因是forEach遍历,仅仅是短时间内连续发起了多个请求,对于某一次请求有等待过程,但对于整体的多次请求是没有作用的 ,也就是async await仅仅作用于某一次请求的处理过程中,并不作用于所有请求的先后顺序。
  • 贴上chatGPT的回答

3.延伸问题:JavaScript 中,为什么数组.map循环中可以使用async/await,而数组.forEach中不可以使用async/await?

  • Array.map 和 Array.forEach 是 JavaScript 中的两种不同的数组循环方法。Array.map 方法会映射数组的每个元素,并返回一个新的数组,其中包含映射函数的结果。相反,Array.forEach 方法只是遍历数组中的每个元素,不会返回任何结果。因为 Array.map 方法会返回新数组,所以可以使用 async/await 来等待异步操作完成,并在映射数组中获取结果
    例如 map中使用:
async function processArray(array) {
  return await Promise.all(array.map(async item => {
    const result = await someAsyncOperation(item);
    return result;
  }));
}

与记一次在forEach中使用aynac/await中的坑相似的内容:

记一次在forEach中使用aynac/await中的坑

1.背景 在写一个对齐脚本时 发现下列问题 const timeList = await imageList.map( (item,index)=>{ return item.identify_border(start_time, end_time) }) // timeList = [Promis

记一次线上Redis内存占用过高、大Key问题的排查

问题背景 在一个风和日丽的下午,公司某项目现场运维同学反馈,生产环境3个Redis的Sentinel集群节点内存占用都很高,达到了17GB的内存占用量。 稍加思索,应该是某些Key的Value数据体量过大,占用了过多的内存空间,我们在使用Redis的过程中,单个Value或者单个集合中的元素应该保证

记一次难忘的json反序列化问题排查经历

前言 最近我在做知识星球中的商品秒杀系统,昨天遇到了一个诡异的json反序列化问题,感觉挺有意思的,现在拿出来跟大家一起分享一下,希望对你会有所帮助。 案发现场 我最近在做知识星球中的商品秒杀系统,写了一个filter,获取用户请求的header中获取JWT的token信息。 然后根据token信息

记一次nginx配置不当引发的499与failover 机制失效

背景 nginx 499在服务端推送流量高峰期长期以来都是存在的,间或还能达到告警阈值触发一小波告警,但主观上一直认为499是客户端主动断开,可能和推送高峰期的用户打开推送后很快杀死app有关,没有进一步探究问题根源。 然而近期在非高峰期也存在499超过告警阈值的偶发情况,多的时候一天几次,少的时候

记一次由于操作失误致使数据库瘫痪的故障分析与解决方案

在这篇文章中,我将分享一次由于操作不当导致数据库瘫痪的经验。通过回顾故障发生的时间、系统简介、时间线、问题分析和经验总结等方面的内容。讨论操作时间不当、操作流程不当、缺乏执行计划和限流机制等问题,并提出一些建议,如确认数据库更新时间、优化更新操作、使用限流工具、设置超时时间和重试机制、调整数据库参数以及定期维护和优化数据库。通过分享这次经验,我希望能帮助他人避免类似的错误,并提高数据库操作的准确性和稳定性。

记一次MySQL执行修改语句超时问题

异常问题 原因分析 这个问题发生在开发环境,怀疑是提交事务时终止项目运行,没有提交该事务,造成死锁 调试该事务时时间太长,为什么说有这个原因呢,因为通过查找日志显示 The client was disconnected by the server because of inactivity. Se

记一次 .NET 某医疗器械 程序崩溃分析

一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用 AEDebug 在程序崩溃的时候自动抽一管血出来,看看崩溃点是什么,其实我的系列文章中,关于崩溃类的dump比较少,刚好补一篇上来,话不多说

记一次 .NET 某医保平台 CPU 爆高分析

一:背景 1. 讲故事 一直在追这个系列的朋友应该能感受到,我给这个行业中无数的陌生人分析过各种dump,终于在上周有位老同学找到我,还是个大妹子,必须有求必应 😁😁😁。 妹子公司的系统最近在某次升级之后,在高峰期会遇到 CPU 爆高的现象,有些单位你懂的,很强势,所以就苦逼了程序媛,不管怎么

记一次 腾讯会议 的意外崩溃分析

一:背景 1. 讲故事 前段时间在用 腾讯会议 直播的时候,居然意外崩溃了,还好不是在训练营上课,不然又得重录了,崩完之后发现 腾讯会议 的 bugreport 组件会自动生成一个 minidump,截图如下: 作为一个.NET高级调试的技术博主,非 .NET 的程序也得要研究研究哈😄😄😄,有

记一次 Windows10 内存压缩模块 崩溃分析

一:背景 1. 讲故事 在给各位朋友免费分析 .NET程序 各种故障的同时,往往也会收到各种其他类型的dump,比如:Windows 崩溃,C++ 崩溃,Mono 崩溃,真的是啥都有,由于基础知识的相对缺乏,分析起来并不是那么的顺利,今天就聊一个 Windows 崩溃的内核dump 吧,这个 dum