迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 > JavaScript >

JavaScript 异步 forEach

作者:迹忆客 最近更新:2023/06/05 浏览次数:

在本篇文章中,我们将看看我们是否可以在 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');

这里有一些问题:

  1. 未处理迭代器函数返回的 Promise; 因此,如果其中一个出错,也不会被注意到。 如果节点 10 上没有注册 unhandledrejection 侦听器,进程就会崩溃!
  2. 所有奖金是同时分配的,而不是顺序分配的,因为 forEach 不会等待每个承诺一个接一个地实现。 结果,循环在所有奖金发放之前就结束了。
  3. 结果,在任何奖励完全发放之前,sendEmail() 发送了电子邮件。 也许一个也不会发出; 他们可能都会抛出错误!

以下是我们可以为此实施的解决方案:

  1. 连续处理每个奖金。 你可以使用 for...of 构造,因为 JavaScript 支持异步等待。
    for (const employee of employees) {
    await giveBonusToEmployee(employee);
    }
    
    在继续下一个奖金之前,此循环将等待前一个奖励发出。 虽然它会比我们需要的更冗长,但您也可以在这种情况下使用典型的 for(...;...;...) 。
  2. 并行处理所有奖金。
    await Promise.all(employees.map(async (employee) => {
    await giveBonusToEmployee(employee);
    }));
    
    如果顺序无关紧要,则可以更快地同时分析所有员工。 这将立即开始发放所有奖金,但在发送所有奖金之前不会发送电子邮件()。

for 和 while 循环自然地与 async-await 一起运行,因为它们是在原始函数体中编写的。 但是,当您调用另一个函数时,仅当被调用函数返回一个承诺并处理该承诺时,才能使用 async-await。

因为 .reduce().map() 都会产生一个我们可能等待的承诺或一系列承诺,所以我们可以使用它们。

但是,大多数数组方法不返回承诺或允许将承诺从一个调用传递到另一个调用,因此无法异步使用它们。 因此,异步代码不能在数组内部使用,例如 array.some()array.filter()

上一篇:JavaScript 中 URL 解码

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

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 浏览次数:171 分类:JavaScript

JavaScript 触发事件 在 JavaScript 中,原始方法 initEvent() 用于创建新事件。 最新更新添加了用于构建自定义事件的新关键字。 此外,在为 JavaScript 构建的清单中还有大量事件。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便