JavaScript 中的异步 forEach

 更新时间:2023年07月08日 11:44:15   作者:迹忆客  
这篇文章主要介绍了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() 发送了电子邮件。 也许一个也不会发出; 他们可能都会抛出错误!

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

1.连续处理每个奖金。 你可以使用 for…of 构造,因为 JavaScript 支持异步等待。

for (const employee of employees) {
  await giveBonusToEmployee(employee);
}

在继续下一个奖金之前,此循环将等待前一个奖励发出。 虽然它会比我们需要的更冗长,但您也可以在这种情况下使用典型的 for(…;…;…) 。

1.并行处理所有奖金。

await Promise.all(employees.map(async (employee) => {
  await giveBonusToEmployee(employee);
}));

如果顺序无关紧要,则可以更快地同时分析所有员工。 这将立即开始发放所有奖金,但在发送所有奖金之前不会发送电子邮件()。

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

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

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

到此这篇关于JavaScript 异步 forEach的文章就介绍到这了,更多相关js异步 forEach内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js设置function参数默认值(适合没有传参情况)

    js设置function参数默认值(适合没有传参情况)

    div+css模拟js信息框的类库时遇到一个问题当没有传递参数过去时自动使用提示信息作为窗口标题,具体的实现如下
    2014-02-02
  • javascript实现的平方米、亩、公顷单位换算小程序

    javascript实现的平方米、亩、公顷单位换算小程序

    这篇文章主要介绍了javascript实现的平方米、亩、公顷单位换算小程序,此代码通过URL传参的方式使用,也可以根据自己的需求做些改动,需要的朋友可以参考下
    2014-08-08
  • Js自定义多选框效果的实例代码

    Js自定义多选框效果的实例代码

    本篇文章主要介绍了Js自定义多选效果的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 详解JavaScript数据类型和判断方法

    详解JavaScript数据类型和判断方法

    这篇文章主要介绍了JavaScript数据类型和判断方法的相关资料,帮助大家更好的理解和学习JavaScript,感兴趣的朋友可以了解下
    2020-09-09
  • Javascript的爷孙通信和组件自调用详解

    Javascript的爷孙通信和组件自调用详解

    这篇文章主要为大家详细介绍了Javascript的爷孙通信和组件自调用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • javascript canvas API内容整理

    javascript canvas API内容整理

    在本篇文章里小编给大家分享的是关于javascript canvas API内容整理,有需要的朋友们可以跟着学习参考下。
    2020-02-02
  • Tabella.js项目常见问题及解决方案详解

    Tabella.js项目常见问题及解决方案详解

    Tabella.js是纯JavaScript响应式表格插件,支持触摸操作与AMD模块加载,这篇文章主要介绍了Tabella.js项目常见问题及解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-05-05
  • JavaScript解决浮点数运算精度丢失问题的几种方案

    JavaScript解决浮点数运算精度丢失问题的几种方案

    在开发项目的过程中,我们难免会遇到数值计算的场景,此时,我们通常会遇到数值计算结果和我们的预期不一致的情况,通常发生这种情况的原因都是因为JavaScript精度丢失的问题,所以本文给大家介绍了JavaScript解决浮点数运算精度丢失问题的几种方案
    2025-06-06
  • JS匿名函数类生成方式实例分析

    JS匿名函数类生成方式实例分析

    这篇文章主要介绍了JS匿名函数类生成方式,结合实例形式分析了javascript匿名函数类相关属性与方法定义与使用技巧,需要的朋友可以参考下
    2016-11-11
  • JS获取select的value和text值的简单实例

    JS获取select的value和text值的简单实例

    本篇文章主要是对JS获取select的value和text值的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02

最新评论