js在处理异步任务时,forEach和for...of循环之间的区别

先看效果

forEach循环:

1、forEach是数组的原生方法,用于遍历数组。

2、它无法直接处理异步任务,因为它不会等待每个任务的完成,而是立即执行下一个任务。

3、这意味着如果在forEach循环中执行异步任务,它们将会同时进行,可能导致结果的顺序混乱或出现其他问题。

示例:

javascript 复制代码
    const getVideoResolutionRatio = (val) => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(val * 2);
        }, 1200)
      });
    }
    
    const getValueForEach = async () => {
      const videoFiles = [1, 2, 3];
      let tempList = [];
      videoFiles.forEach(async (item) => {
        let reslut = await getVideoResolutionRatio(item);
        tempList.push(reslut);
      })
      return tempList
    }
     // ForEach获取值:
    const testForEach = async () => {
      let test = await getValueForEach()
      console.log(test);
    }
    testForEach() //输出[]

在上述示例中,异步任务asyncTask被放在forEach循环中。由于forEach不会等待异步任务的完成。

for...of循环:

for...of循环是ES6引入的一种遍历方式,可以用于遍历可迭代对象(如数组、字符串、Set、Map等)。

它支持await关键字,可以在循环体中等待异步任务的完成。

for...of循环会按照顺序依次处理每个异步任务,等待上一个任务完成后再执行下一个任务。

示例:

javascript 复制代码
    const getVideoResolutionRatio = (val) => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(val * 2);
        }, 1200)
      });
    }

    const getValueForOf = async () => {
      const videoFiles = [1, 2, 3];
      let tempList = [];
      for (const item of videoFiles) {
        let reslut = await getVideoResolutionRatio(item);
        tempList.push(reslut);
      }
      return tempList
    }


    // ForOf获取值:
    const testForOf = async () => {
      let test = await getValueForOf()
      console.log(test);
    }
    testForOf() //输入[2, 4, 6]

在上述示例中,使用了for...of循环来遍历数组,并在循环体中使用await关键字等待异步任务的完成。这样可以保证按照数组的顺序依次输出结果。

总结:,for...of循环在处理异步任务时更加可靠,可以控制任务的顺序和流程,而forEach循环无法直接处理异步任务,容易导致结果的混乱。

相关推荐
TU不秃头22 分钟前
JS逆向实战五:某海关公示平台分析(瑞数加密)
javascript·爬虫
南境十里·墨染春水2 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
无巧不成书02182 小时前
30分钟入门Java:从历史到Hello World的小白指南
java·开发语言
2301_797172753 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
anOnion3 小时前
构建无障碍组件之Carousel Pattern
前端·html·交互设计
ssshooter3 小时前
Tauri 2 iOS 开发避坑指南:文件保存、Dialog 和 Documents 目录的那些坑
前端·后端·ios
比昨天多敲两行4 小时前
C++ 二叉搜索树
开发语言·c++·算法
Можно4 小时前
深入理解 ES6 Proxy:与 Object.defineProperty 的全面对比
前端·javascript·vue.js
Birdy_x4 小时前
接口自动化项目实战(1):requests请求封装
开发语言·前端·python
海海不瞌睡(捏捏王子)4 小时前
C++ 知识点概要
开发语言·c++