JavaScript 异步 forEach
在本篇文章中,我们将看看我们是否可以在 JavaScript 的 forEach 循环中使用异步。 有哪些选择?
JavaScript 中的异步 forEach
异步编程不适用于 Array.prototype.forEach。 它不适用于 async-await,就像它不适用于 promises 一样。
const employees = await this.getEmployees();
// BAD
await employees.forEach(async (employee) => {
await giveBonusToEmployee(employee);
});
await sendEmail('All bonuses sent');
这里有一些问题:
- 未处理迭代器函数返回的 Promise; 因此,如果其中一个出错,也不会被注意到。 如果节点 10 上没有注册 unhandledrejection 侦听器,进程就会崩溃!
- 所有奖金是同时分配的,而不是顺序分配的,因为 forEach 不会等待每个承诺一个接一个地实现。 结果,循环在所有奖金发放之前就结束了。
-
结果,在任何奖励完全发放之前,
sendEmail()
发送了电子邮件。 也许一个也不会发出; 他们可能都会抛出错误!
以下是我们可以为此实施的解决方案:
-
连续处理每个奖金。 你可以使用 for...of 构造,因为 JavaScript 支持异步等待。
for (const employee of employees) { await giveBonusToEmployee(employee); }
-
并行处理所有奖金。
await Promise.all(employees.map(async (employee) => { await giveBonusToEmployee(employee); }));
for 和 while 循环自然地与 async-await 一起运行,因为它们是在原始函数体中编写的。 但是,当您调用另一个函数时,仅当被调用函数返回一个承诺并处理该承诺时,才能使用 async-await。
因为 .reduce()
和 .map()
都会产生一个我们可能等待的承诺或一系列承诺,所以我们可以使用它们。
但是,大多数数组方法不返回承诺或允许将承诺从一个调用传递到另一个调用,因此无法异步使用它们。 因此,异步代码不能在数组内部使用,例如 array.some()
或 array.filter()
。
相关文章
JavaScript 中 URL 解码
发布时间:2023/06/06 浏览次数:118 分类:JavaScript
-
本文着眼于 URL 解码以及如何使用 JavaScript 对编码的 URL 进行解码。需要URL编解码。JavaScript 中的 URL 解码。在 JavaScript 中,可以通过三种方法对编码的 URL 进行解码。
如何在 JavaScript 中生成 PDF
发布时间:2023/06/06 浏览次数:145 分类:JavaScript
-
在本文中,我们将学习用 JavaScript 创建 PDF 的有效方法。 在示例的帮助下,我们将了解 JavaScript 中有哪些可用的库来创建 PDF。
在 JavaScript 中使用种子生成随机数
发布时间:2023/06/06 浏览次数:182 分类:JavaScript
-
本文介绍如何使用种子在 JavaScript 中生成随机数。 我们实现这一点要归功于 PRNG,它接受一个种子并返回一个基于该种子的随机数。
JavaScript += 的效果
发布时间:2023/06/06 浏览次数:152 分类:JavaScript
-
本篇文章将介绍 JavaScript += 在以下情况下的效果。JavaScript 加上数字之间的相等 ;JavaScript 加上字符串之间相等 ;JavaScript 在数字和字符串之间加上相等
JavaScript 电话号码格式
发布时间:2023/06/06 浏览次数:181 分类:JavaScript
-
在本文中,我们将了解在 JavaScript 源代码中格式化电话号码的最佳方式,以及在我们的 JavaScript 代码中格式化数字的好处。JavaScript 中的电话号码格式 在 JavaScript 中,我们有多个选项可以有效地
JavaScript 中的图像加载事件
发布时间:2023/06/05 浏览次数:154 分类:JavaScript
-
本文将讨论如何在 JavaScript 中处理 .onload 事件。 我们将学习如何在上传图像后使用 JavaScript 创建警告框。我们还将了解如何通过创建警告框使用 JavaScript 检查图像是否已加载。JavaScript 中的 .
JavaScript 删除所有事件监听器
发布时间:2023/06/05 浏览次数:84 分类:JavaScript
-
本篇文章将介绍如何删除 JavaScript 中的所有事件侦听器。移除 JavaScript 中的所有事件监听器 EventTarget 接口的 addEventListener() 方法配置一个函数,只要指定的事件被传递到目标,就会调用该函数。
JavaScript 中事件冒泡和捕获的区别
发布时间:2023/06/05 浏览次数:54 分类:JavaScript
-
本文将讨论在 JavaScript 中使用的事件冒泡和事件捕获。 阅读本文后,您将清楚地了解 JavaScript 中的事件冒泡和捕获。
JavaScript 触发事件
发布时间:2023/06/05 浏览次数:171 分类:JavaScript
-
JavaScript 触发事件 在 JavaScript 中,原始方法 initEvent() 用于创建新事件。 最新更新添加了用于构建自定义事件的新关键字。 此外,在为 JavaScript 构建的清单中还有大量事件。