如何在forEach内使用异步调用 async/await
翻自: How to use async and await in a forEach JS loop?
https://learn.coderslang.com/0144-how-to-use-async-and-await-in-a-foreach-js-loop/
事实上我们无法在 forEach 循环内使用 async/await 起到异步作用,让我们看看如何解决修复它。
async/await 在forEach 中为啥不起作用?
当你在forEach 循环内调用异步函数,下一个循环并不会等到上个循环结果后再被调用
想象一下,你有一个 getUsers 方法返回用户列表 User , user只有用户列表,但不包含具体的detail信息,所以你使用forEach 试图去获取用户详情
const users = await getUsers();
users.forEach(user => {
const details = user.getDetails();
console.log(details);
})
打印结果却是 3 个pending状态的 promise
你很自然的想到getDetails是个异步函数,需要给它加上await 关键字
const users = await getUsers();
users.forEach(user => {
const details = await user.getDetails();
console.log(details);
})
运行后发现报了另一个语法错误
SyntaxError: await is only valid in async function
你意识到给如果 forEach 传递的函数有是异步 则需要用 async 标记为异步函数
再次修复它
const users = await getUsers();
users.forEach(async (user) => {
const details = await user.getDetails();
console.log(details);
})
很好,你盯着半天发现并没有按users数组的顺序输出结果
解决方案:
你需要使用for 代替 forEach 循环重写这部分代码
const users = await getUsers();
for (let i = 0; i < users.length; i++) {
const details = await user.getDetails();
console.log(details);
}
也可以使用 for .... of
const users = await getUsers();
for (const user of users) {
const details = await user.getDetails();
console.log(details);
}
如果你实在不喜欢简单的代码,那么可以用个小技巧 使用 Array 的 map 方法
const users = await getUsers();
const userDetailsPromises = users.map(user => user.getDetails());
const userDetails = await Promise.all(userDetailsPromises);
console.log(userDetails);
让我们一步步分析
1、第一行代码没有改变就是获取 users 数组
2、使用map循环调用 getDetails 返回新的 userDetailsPromises 数组,数组元素都为Promise类型
3、使用 await Promise.all 等待所有 Promise 处理完毕
4、最后打印出结果数组
代码也可以组合简化为
const userDetails = await Promise.all(users.map(user => user.getDetails()));
如何在forEach内使用异步调用 async/await的更多相关文章
- SpringBoot学习笔记(七):SpringBoot使用AOP统一处理请求日志、SpringBoot定时任务@Scheduled、SpringBoot异步调用Async、自定义参数
SpringBoot使用AOP统一处理请求日志 这里就提到了我们Spring当中的AOP,也就是面向切面编程,今天我们使用AOP去对我们的所有请求进行一个统一处理.首先在pom.xml中引入我们需要的 ...
- springboot:异步调用@Async
在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...
- MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
MVC+Spring.NET+NHibernate .NET SSH框架整合 在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...
- 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法
什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...
- .net 异步函数 Async await
.net 异步函数 Async await 一旦为函数添加async关键字 该函数就是一个异步函数. 异步方法必须返回 void 或 Task<> 类型. public static ...
- 抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext
长话短说,本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext 引言 C#异步编程语法糖async/await,使开发者很容易就能编写异步代码. ...
- 异步编程Async/await关键字
异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ...
- javascript异步编程 Async/await
Async/await Async/await 在学习他之前应当补充一定的 promise 知识 它是一种与 promise 相配合的特殊语法,目前被认为是异步编程的终级解决方案 值得我们每一个人学习 ...
- springboot 异步调用Async使用方法
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...
- springboot之异步调用@Async
原文:http://www.cnblogs.com/xuwenjin/p/8858050.html 引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交 ...
随机推荐
- 使用Docker部署Tomcat
目录 使用Docker部署Tomcat 1. 获取镜像 2. 第一次启动tomcat 3.带参数启动 4.查看tomcat日志 5.时区问题 使用Docker部署Tomcat 1. 获取镜像 dock ...
- 使用OpenCV实现视频去抖
使用OpenCV实现视频去抖 整体步骤: 设置输入输出视频 寻找帧之间的移动:使用opencv的特征检测器,检测前一帧的特征,并使用Lucas-Kanade光流算法在下一帧跟踪这些特征,根据两组点,将 ...
- 【求助】navicat导入monogdb数据报错
navicat在进行mongodb数据导入时报错 Navicat Premium 版本 16.1.3 (64-bit) Windows 11 Unknown Internal Error (A7052 ...
- Linux 进程卡住了怎么办?
在我们使用 Linux 系统时,如果网络或者磁盘等 I/O 出问题,会发现进程卡住了,即使用 kill -9 也无法杀掉进程,很多常用的调试工具,比如 strace, pstack 等也都失灵了,是怎 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第3章)
第 3 章 使用 ASP.NET Core 开发微服务 微服务定义 微服务是一个支持特定业务场景的独立部署单元.它借助语义化版本管理.定义良好的 API 与其他后端服务交互.它的天然特点就是严格遵守单 ...
- Linux-双网卡绑定bond详解
1.什么是bond 网卡bond是通过多张物理网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及以后的版本均供bonding模 ...
- 扯淡的DevOps,我们开发根本不想做运维!
引言 最初考虑引用" DevOps 已死,平台工程才是未来"作为标题,但这样的表达可能太过于绝对.最终,决定用了"扯淡的"这个词来描述 DevOps,但这并不是 ...
- SSL证书类型价格和购买
SSL证书 SSL和HTTPS的工作机制就不多说了, 密钥交换加通道依然是非常靠谱的安全访问方式, 除非你的浏览器连证书和DNS都被劫持, 否则中间节点要解密/篡改HTTPS访问的可能性微乎其微. 现 ...
- Vue+SpringBoot+ElementUI实战学生管理系统-4.后端API编写
1.章节介绍 前一篇介绍了项目的表结构设计,这一篇编写后端API,需要的朋友可以拿去自己定制.:) 2.获取源码 源码是捐赠方式获取,详细请QQ联系我 :)! 3.项目截图 登录页 列表操作 动态图 ...
- win32- 窗口模板
主要用于日常的win32窗口的测试 #include <Windows.h> #include <stdio.h> #include <iostream> usin ...