首页 > 其他分享 >es6,for....of是异步的嘛? 如何实现循环中异步实现

es6,for....of是异步的嘛? 如何实现循环中异步实现

时间:2024-11-07 09:08:00浏览次数:1  
标签:异步 arr num ... .... 循环 setTimeout es6

for...of 循环本身 不是异步的,它是同步执行的。这意味着 for...of 循环会按顺序依次执行每一项,直到循环结束。如果循环中的操作是异步的(例如,async 函数或者 Promise),则这些异步操作会并发执行,但 for...of 本身不会等待这些操作完成,除非你显式地处理它们。

让我们通过一个例子来说明这个行为:

示例 1:同步操作

const arr = [1, 2, 3];

for (const num of arr) {
  console.log(num);
}

输出:

1
2
3

这是同步的,for...of 循环会按顺序打印数组中的每个元素。

示例 2:异步操作

如果你在 for...of 中使用异步操作(例如 setTimeout 或者 Promise),则 for...of 依然会同步执行,不会等待异步操作完成。

const arr = [1, 2, 3];

for (const num of arr) {
  setTimeout(() => {
    console.log(num);
  }, 1000);
}

输出:

1
2
3

尽管每个 setTimeout 都延迟了 1 秒才输出,但 for...of 仍然是同步执行的。它会立即执行每次循环,而不会等待 setTimeout 完成。

异步操作与 await 一起使用

如果你想要 for...of 循环等待异步操作完成,你可以在 for...of 中使用 async/await 来实现:

async function processArray(arr) {
  for (const num of arr) {
    await new Promise(resolve => setTimeout(() => {
      console.log(num);
      resolve();
    }, 1000));
  }
}

processArray([1, 2, 3]);

输出:

1
(等待 1 秒)
2
(等待 1 秒)
3

在这个例子中,await 使得 for...of 循环在每个异步操作(setTimeout)完成后才继续执行,因此输出是顺序的,每个数字间隔 1 秒。

总结

  • for...of 循环是同步的,它会按顺序执行每一项。
  • 如果循环中包含异步操作(例如 PromisesetTimeout),它不会等待异步操作完成,除非使用 async/await 来显式地等待异步操作完成。

标签:异步,arr,num,...,....,循环,setTimeout,es6
From: https://www.cnblogs.com/pansidong/p/18531494

相关文章

  • es6 flat 将数组降维方法
    flat()是JavaScript中的一个数组方法,用于将嵌套的数组“拉平”成一个新数组。该方法会递归地“降维”数组,直到指定的深度。语法:arr.flat(depth);depth:可选,表示嵌套数组的“深度”。默认为1。传入一个更大的值,数组会被拉平更多层级。如果传入Infinity,则会将所有嵌套的数......
  • 微信小程序使用Promise异步请求
     在微信小程序中,如果你希望在一个HTTP请求完成后再继续执行下面的代码,可以将后续代码放入请求的回调函数中。如果不想使用嵌套的回调函数,可以考虑使用 Promise 来处理异步请求。这样可以更清晰地组织代码,还能避免“回调地狱”的问题。这是原方法并不会在执行完http请求后......
  • C#异步和多线程的理解
    1.异步编程(AsynchronousProgramming)异步编程是通过非阻塞方式执行任务,通常适用于I/O密集型任务,例如文件读写、网络请求、数据库访问等。这类操作不需要占用大量CPU资源,而是等待外部资源(如网络或硬盘)响应。在C#中,异步编程使用async和await关键字来实现。异步方法会返......
  • CompletableFuture异步编排接口优化方案
    接口优化方案(1)程序本身,减少不必要的条件判断、循环(2)减少数据库的交互次数,以及每个sql查询的数据量(列数和行数越少越好)(3)提高sql的性能,通过建立合适的索引(4)使用java8的stream流提高集合的遍历操作的效率(5)引入缓存,从redis中加载数据的效率高于mysql(6)使用多线程异步......
  • JS-ES6标准
    JS-ES6标准箭头函数更简洁的语法:箭头函数允许你不使用function关键字来定义函数。隐式的return:如果箭头函数的函数体只有一个表达式,那么这个表达式的值会被隐式返回,不需要return关键字。不绑定自己的this:箭头函数不会创建自己的this上下文,this值由外围最近一层非箭头函数决定......
  • 【论文阅读】<ICSE2024>CoderEval: A Benchmark of Pragmatic Code Generation......
    CoderEval:ABenchmarkofPragmaticCodeGenerationwithGenerativePre-trainedModels标题:CoderEval:基于生成式预训练模型的实用代码生成基准摘要:基于预训练和微调范式的代码生成模型在学术界和工业界中得到了广泛应用,催生了许多知名的工业模型,如Codex、CodeGen和Pan......
  • es6 语法学习 - 解释器模式
    es6语法学习-解释器模式一、基本概念解释器设计模式(InterpreterPattern)是一种行为型设计模式,它用于将一种特定的语言或表达式转换为对象,并通过解释器来解释和执行这些对象。二、优点扩展性好:由于语法由很多类表示,因此容易改变及扩展语言。灵活性高:可以根据不同的规......
  • 异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)
     ......
  • 关于Copilot出现:You don`t have access to Github Copilot .....的问题解决方案
    前面如何如何配置,以及如何如何上传学生证资料等我这里不赘述badendinghappyending出现这个界面这个问题就是set_up不是很完全,设置一下就行disable改为enable等这样再回去IDE,就可以正常使用了......
  • playwright异步操作-多标签执行
    #作者:yancy#创建日期:2024/11/210:06#放屁:钱钱钱importasyncioimporttimefromplaywright.async_apiimportasync_playwrightfromplaywright.sync_apiimportsync_playwrightimportrandomasyncdefget_url(page,url):awaitpage.goto(url,timeout......