iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JS循环中正确使用async、await的方法是什么
  • 119
分享到

JS循环中正确使用async、await的方法是什么

2023-06-22 03:06:00 119人浏览 独家记忆
摘要

js循环中正确使用async、await的方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概览(循环方式 - 常用)formapforEachfilter声明遍历的

js循环中正确使用async、await的方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

概览(循环方式 - 常用)

  • for

  • map

  • forEach

  • filter

声明遍历的数组和异步方法

声明一个数组:⬇️

const skills = ['js', 'Vue', 'node', 'React']

再声明一个promise的异步代码: ⬇️

function getSkillPromise (value) {  return new Promise((resolve, reject) => {    setTimeout(() => {      resolve(value)    }, 1000)  })}

for 循环中使用

由于for循环并非函数,而async、await需要在函数中使用,因此需要在for循环外套一层function

async function test () {  for (let i = 0; i < skills.length; i++) {    const skill = skills[i]    const res = await getSkillPromise(skill)    console.log(res)  }}test() // 调用

JS循环中正确使用async、await的方法是什么

当使用await时,希望javascript暂停执行,直到等待 promise 返回处理结果。上述结果意味着for循环中有异步代码,是可以等到for循环中异步代码完全跑完之后再执行for循环后面的代码。

但是他不能处理回调的循环,如forEach、map、filter等,下面具体分析。

map 中使用

在map中使用await, map 的返回值始是promise数组,这是因为异步函数总是返回promise。

async function test () {  console.log('start')  const res = skills.map(async item => {    return await getSkillPromise(item)  })  console.log(res)  console.log('end')}test()

结果:始终为promise数组

start[  Promise { <pending> },  Promise { <pending> },  Promise { <pending> },  Promise { <pending> }]end

若果你想要等到promise的返回结果,可以使用promise.all()处理一下

async function test () {  console.log('start')  const res = skills.map(async item => {    return await getSkillPromise(item)  })  const resPromise = await Promise.all(res)  console.log(resPromise)  console.log('end')}test()// 结果start[ 'js', 'vue', 'node', 'react' ]end

forEach 中使用

先上代码和结果

async function test () {  console.log('start')  skills.forEach(async item => {    const res = await getSkillPromise(item)    console.log(res)  })  console.log('end')}test()

预期结果

'Start'

'js'

'vue'

'node'

'react'

'End'

实际结果 在forEach循环等待异步结果返回之前就执行了console.log('end')

'Start'

'End'

'js'

'vue'

'node'

'react'

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

filter 中使用

使用filter过滤item为vue或者react的选项

正常使用 filter:

async function test () {  console.log('start')  const res = skills.filter(item => {    return ['vue', 'react'].includes(item)  })  console.log(res)  console.log('end')}test() // 调用// 结果start[ 'vue', 'react' ]end

使用 await后:

async function test () {  console.log('start')  const res = skills.filter(async item => {    const skill = await getSkillPromise(item)    return ['vue', 'react'].includes(item)  })  console.log(res)  console.log('end')}test()

预期结果:

start

[ 'vue', 'react' ]

end

实际结果:

[ 'js', 'vue', 'node', 'react' ]

end

结论:因为异步函数getSkillPromise返回结果返回的promise总是真的,所以所有选项都通过了过滤

  1. 如果你想连续执行await调用,请使用for循环(或任何没有回调的循环)。

  2. 永远不要和forEach一起使用await,而是使用for循环(或任何没有回调的循环)。

  3. 不要在 filter 和 reduce 中使用 await,如果需要,先用 map 进一步骤处理,然后在使用 filter 和 reduce 进行处理。

关于JS循环中正确使用async、await的方法是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: JS循环中正确使用async、await的方法是什么

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作