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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • css+html+js实现五角星评分

    css+html+js实现五角星评分

    这篇文章主要为大家详细介绍了css+html+js实现五角星评分,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • JQuery 表格操作(交替显示、拖动表格行、选择行等)

    JQuery 表格操作(交替显示、拖动表格行、选择行等)

    JQuery 表格操作包括交替显示、拖动表格行、选择行等功能,大家可以参考下。
    2009-07-07
  • JS实现纸牌发牌动画

    JS实现纸牌发牌动画

    这篇文章主要为大家详细介绍了JS实现纸牌发牌动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • es6和commonJs的区别解析

    es6和commonJs的区别解析

    这篇文章主要介绍了es6和commonJs的区别,ES6的模块化规范更加先进、灵活,能够适应更多的应用场景,而CommonJS则更加简单、易用,广泛应用于Node.js开发中,在实际应用中,可以根据具体情况选择使用不同的模块化方案,需要的朋友可以参考下
    2023-03-03
  • 微信小程序获取用户绑定手机号方法示例

    微信小程序获取用户绑定手机号方法示例

    这篇文章主要给大家介绍了关于微信小程序如何获取用户绑定手机号的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • JavaScript-定时器0~9抽奖系统详解(代码)

    JavaScript-定时器0~9抽奖系统详解(代码)

    这篇文章主要介绍了 JavaScript-定时器0~9抽奖系统,通过代码实例说明函数调用的整体操作,具体步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。
    2017-08-08
  • 利用try-catch判断变量是已声明未声明还是未赋值

    利用try-catch判断变量是已声明未声明还是未赋值

    这篇文章主要介绍了利用try-catch判断变量是已声明未赋值还是未声明,需要的朋友可以参考下
    2014-03-03
  • 理解javascript中的闭包

    理解javascript中的闭包

    本文主要介绍了javascript中闭包的特性、作用、示例代码以及注意事项。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • canvas 2d 环形统计图手写实现示例

    canvas 2d 环形统计图手写实现示例

    这篇文章主要为大家介绍了canvas 2d 环形统计图手写实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • JS实现表单中点击小眼睛显示隐藏密码框中的密码

    JS实现表单中点击小眼睛显示隐藏密码框中的密码

    这篇文章主要介绍了JS实现表单中点击小眼睛显示隐藏密码框中的密码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下
    2020-04-04

最新评论