返回顶部
首页 > 资讯 > 精选 >JS循环中使用await会产生什么反应
  • 469
分享到

JS循环中使用await会产生什么反应

2023-07-05 08:07:31 469人浏览 安东尼
摘要

本篇内容介绍了“js循环中使用await会产生什么反应”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!这个问题是这样产生的?某天,在学习异步的

本篇内容介绍了“js循环中使用await会产生什么反应”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

这个问题是这样产生的?某天,在学习异步的知识遇到这样一道题:使用Promise的方式,每隔一秒输出数组中一个值

const arr = [1, 2, 3]arr.reduce((pre, cur) => {  return pre.then(() => {    return new Promise((resolve, reject) => {      setTimeout(() => {        resolve(console.log(cur))      }, 1000);    })  })}, Promise.resolve())

那这段代码还是挺好了解的,相当于

Promise.resolve().then(() => {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve(console.log(1))    }, 1000);  })}).then(() => {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve(console.log(2))    }, 1000);  })}).then(() => {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve(console.log(3))    }, 1000);  })})

看完之后,我就在想,如果我在循环中,每次输出值之后停止一秒,也可以解决,于是乎就有了以下代码

const arr = [1, 2, 3]const sleep = (ms) => {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve()    }, ms)  })}for (let i = 0; i < arr.length; i++) {  console.log(arr[i]);  await sleep(1000)}

打印结果也是符合预期的,在这里我就产生了第一个疑问:await不是要搭配async使用的么?这里怎么能单独使用?(不信你把代码放到浏览器控制台试试)

接着我把for改成了forEach,发现根本达不到效果,第二个疑问产生:forEach中await为什么失效了呢?

arr.forEach(async item => {  console.log(item);  await sleep(1000)})

带着这两个疑问,那就开始学习起来,寻找答案。

在for循环中的await

记得在学习async/await的时候有这样一句话,await只能和async搭配一起使用,其实这句话是没有错的。那为什么前面可以直接写await呢,因为我是直接写在浏览器控制台的,咱们在编辑器写代码的时候一定要套一个async使用的

 <script>     const arr = [1, 2, 3]   const sleep = (ms) => {     return new Promise((resolve, reject) => {       setTimeout(() => {         resolve()       }, ms)     })   }   const logByOneSecond = async () => {     for (let i = 0; i < arr.length; i++) {       console.log(arr[i]);       await sleep(1000)     }   }      logByOneSecond() </script>

所以这就算闹了个笑话,哈哈,不过当我遇到不理解的时候,又多了一个思考方向。

好的,如上所述,await确实发挥了他的作用,让JS直到等到了promise返回的处理结果,再继续往下执行;那for...of,while是不是也可以呢

const logByForof = async () => {  for (const item of arr) {    console.log(item);    await sleep(1000)  }    }logByForof()
const logByWhile = async () => {  let i = 0  while (i !== arr.length) {    await sleep(1000)    console.log(arr[i]);    i++  }}logByWhile()

结果也是符合预期,可以在循环中使用await并实现效果

在forEach循环中的await

如一开始,在forEach中并没有的到预期的效果;首先得到一个结果:forEach中async 和await是无效的。

那我看到的解释有以下几种

  • javascript 中的 forEach不支持 promise 感知,也不支持 async 和await,所以不能在 forEach 使用 await 。

  • map/forEach内部使用了while结合callback方式来执行函数,await不会等待callback的执行

  • forEach 只支持同步代码

第二种说法,简化以后的伪代码,如下

while(index < arr.length){  callback(item, index)}

map/forEach是简单的执行下回调函数,并不会处理异步的情况。即:map/forEach 会同时创建出多个回调函数,多个回调函数被加上了各自的 async、await,如下

async ()=>{  await sleep(1000); } async ()=>{   await sleep(1000);} async ()=>{   await sleep(1000);}

各个函数之间是独立的,彼此的回调也是独立的;请求是异步的,彼此之间又没有关联,顺序也就自然无法保证。

“JS循环中使用await会产生什么反应”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: JS循环中使用await会产生什么反应

本文链接: https://lsjlt.com/news/350575.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JS循环中使用await会产生什么反应
    本篇内容介绍了“JS循环中使用await会产生什么反应”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!这个问题是这样产生的?某天,在学习异步的...
    99+
    2023-07-05
  • 聊聊JS循环中使用await会产生什么“化学反应”
    本篇文章给大家带来了关于JavaScript循环的相关知识,其中主要给大家聊聊在js循环中怎么使用使用await以及结果分析,感兴趣的朋友一起来看一下吧,希望对大家有帮助。前言这个问题是这样产生的?某天,在学习异步的知识遇到这样一道题:使用...
    99+
    2023-05-14
    await javascript
  • Java中的HashMap为什么会产生死循环
    目录前置知识死循环执行步骤1死循环执行步骤2死循环执行步骤3解决方案总结前言: HashMap 死循环是一个比较常见、比较经典的问题,在日常的面试中出现的频率比较高,所以接下来咱们通...
    99+
    2024-04-02
  • JS循环中正确使用async、await的方法是什么
    JS循环中正确使用async、await的方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概览(循环方式 - 常用)formapforEachfilter声明遍历的...
    99+
    2023-06-22
  • JS循环中正确使用async、await的姿势分享
    目录概览(循环方式 - 常用)声明遍历的数组和异步方法for 循环中使用map 中使用forEach 中使用filter 中使用附使用小结总结概览(循环方式 - 常用) f...
    99+
    2024-04-02
  • JS中六种For循环怎么使用
    这篇文章主要介绍“JS中六种For循环怎么使用”,在日常操作中,相信很多人在JS中六种For循环怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS中六种For循环怎么使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • Linux生产环境上Sed使用技巧是什么
    今天小编给大家分享一下Linux生产环境上Sed使用技巧是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一个简单的入门一...
    99+
    2023-06-15
  • Java枚举类在生产环境中怎么使用
    这篇文章主要讲解了“Java枚举类在生产环境中怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java枚举类在生产环境中怎么使用”吧!使用大体分为确定业务场景状态、定义枚举类、自定义查...
    99+
    2023-06-29
  • oracle中loop循环使用的方法是什么
    在Oracle中,可以使用PL/SQL语言编写循环控制结构,其中包括三种主要的循环语句:LOOP、WHILE和FOR。其中,LOOP...
    99+
    2024-04-09
    oracle
  • 重定向技术在IDE中的应用,会对GO语言开发产生什么影响?
    随着计算机技术的不断发展,编程语言也在不断更新和完善。GO语言作为一种新兴的编程语言,已经受到了越来越多的关注和使用。在开发过程中,IDE(集成开发环境)是程序员必不可少的工具之一。而在IDE中,重定向技术是一种非常重要的技术,它能够帮助...
    99+
    2023-06-30
    重定向 接口 ide
  • python中使用什么语句可以跳出循环体
    python中跳出循环体的方法:在python中可以使用break或continue语句跳出循环体。具体内容如下:break语句可以用来跳出for和while的循环体,如果你从for或while循环中终止,任何对应的循环else块将不执行。...
    99+
    2024-04-02
  • C/C++中for语句循环使用的方法是什么
    这篇文章主要介绍“C/C++中for语句循环使用的方法是什么”,在日常操作中,相信很多人在C/C++中for语句循环使用的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C/C++中for语句循环使用...
    99+
    2023-07-05
  • SpringBoot中怎么使用异步线程池实现生产环境批量数据推送
    今天小编给大家分享一下SpringBoot中怎么使用异步线程池实现生产环境批量数据推送的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • 在 Linux 实时环境中使用 ASP 重定向会有什么影响?
    ASP(Active Server Pages)是一种基于 Microsoft 的服务器端脚本技术,它可以生成动态的网页内容。ASP 重定向是一种常见的技术,它可以将用户请求重定向到另一个网址。然而,当在 Linux 实时环境中使用 AS...
    99+
    2023-08-24
    重定向 linux 实时
  • 为什么在 ASP.NET 中使用 npm 和 bash 会提高响应速度?
    ASP.NET 是一个常用的 Web 应用程序框架,它为开发人员提供了许多优秀的工具和功能,例如,ASP.NET Core 提供了跨平台支持和轻量级的开发模式,而 ASP.NET MVC 则提供了强大的模型-视图-控制器架构。然而,为了提高...
    99+
    2023-08-20
    响应 npm bash
  • NPM在Windows环境下的分布式ASP应用中的使用方法是什么?
    在分布式ASP应用中,NPM是一个非常重要的工具。它可以帮助我们管理应用所需的各种依赖包,以及对这些依赖包进行版本管理。本文将介绍在Windows环境下使用NPM的方法。 一、安装Node.js 在使用NPM之前,我们需要先安装Node....
    99+
    2023-11-02
    分布式 windows npm
  • 在Java应用程序中使用Bash脚本来记录日志:容器环境中的最佳实践是什么?
    在现代软件开发中,容器化技术已经变得越来越普遍。这种技术可以让我们更加轻松地构建、部署和管理应用程序。随着容器的广泛应用,我们需要思考如何在容器环境中记录应用程序的日志。在这篇文章中,我们将讨论在Java应用程序中使用Bash脚本来记录日...
    99+
    2023-11-05
    日志 bash 容器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作