当前位置: 首页 > news >正文

foreach中使用await的问题

目录

1.说明

2.示例

3.解决方案


1.说明

在foreach中调用异步方法,即使使用了await,不会依次执行每个异步任务,也就是说Array.prototype.forEach不会等待 Promise 完成,即使你在回调函数中返回一个 Promise,forEach 也会继续执行下一个元素,而不会等待前一个 Promise 解决(resolve)。 只是按照顺序启动了所有的异步任务

2.示例

function asyncAll() {let  arrs = []arrs.push(5000)arrs.push(4000)arrs.push(3000)arrs.push(2000)arrs.push(1000)arrs.forEach(async (item) => {console.log('在执行结果之前,'+ item)const res = await async2(item)console.log(res)console.log('在执行结果之后,'+ item)})console.log("所有的都执行完成")
}

async2是一个异步方法,返回promise,执行结果如下:

在执行结果之前,5000
在执行结果之前,4000
在执行结果之前,3000
在执行结果之前,2000
在执行结果之前,1000
所有的都执行完成
1000
在执行结果之后,1000
2000
在执行结果之后,2000
3000
在执行结果之后,3000
4000
在执行结果之后,4000
5000
在执行结果之后,5000

按照顺序启动了任务,但实际却是最后一个任务先执行完成,第一个任务最后执行完成;并且foreach中的任务没有执行完成就执行了foreach后面的处理。

3.解决方案

①使用for of循环,异步任务会按照顺序依次执行

②如果异步任务之间没有明确的顺序,可以使用promise all处理,循环将每个异步任务放在任务数组中,使用promise.all同时执行所有的异步任务,在then处理中可以获取所有异步任务的结果,然后进行后续的处理,这样可以确保异步任务和后续处理的顺序

相关文章:

  • MATLAB中的概率分布生成:从理论到实践
  • 代理(主要是动态)和SpringAOP
  • 泰迪杯特等奖案例深度解析:基于多模态融合与小样本学习的工业产品表面缺陷智能检测系统
  • Latex单栏环境下如何设置表格和图片不独占一栏
  • 12 分钟讲解所有 JavaScript 库/模块[译]
  • 曝光融合(Exposure Fusion)
  • java后端学习
  • 【记录】Windows|竖屏怎么调整分辨率使横竖双屏互动鼠标丝滑
  • 51单片机的lcd12864驱动程序
  • uniapp-商城-57-后台 新增商品(弹窗属性数据添加父级)
  • 虚拟机在挂起恢复后时间漂移问题
  • 吉客云数据集成到金蝶云星空的最佳实践
  • HTML常用标签用法全解析:构建语义化网页的核心指南
  • 工具:shell命令提示符自定义之显示GIT当前分支
  • WebGL2光照效果
  • 龙芯新一代国产服务器CPU及产品闪耀信创大会,助力信创与智算新突破
  • SpringBoot3.4.5下Lombok的@Data注解不生效,解决方案
  • 数据科学和机器学习的“看家兵器”——pandas模块 之六
  • 【漫话机器学习系列】261.工具变量(Instrumental Variables)
  • 《AI大模型应知应会100篇》第66篇:用大模型 + 向量数据库构建你的个性化知识库系统(附实战代码)
  • 做网站每页面费用/世界十大搜索引擎排名
  • 网站开发职业类别代码/最火的网络销售平台
  • 深圳装饰企业前50强/北京云无限优化
  • quiz在哪个网站做/专业做网站公司
  • 网站推广排名怎么做/seo高级优化技巧
  • 网上接网站做/百度在线翻译