JS循环中使用async、await的正确姿势

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

概览(循环方式 - 常用)

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() // 调用
复制代码

当使用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 { },
Promise { },
Promise { },
Promise { }
]
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:

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月前
|
消息中间件 JavaScript 前端开发
最细最有条理解析:事件循环(消息循环)是什么?为什么JS需要异步
度一教育的袁进老师谈到他的理解:单线程是异步产生的原因,事件循环是异步的实现方式。 本质是因为渲染进程因为计算机图形学的限制,只能是单线程。所以需要“异步”这个技术思想来解决页面阻塞的问题,而“事件循环”是实现“异步”这个技术思想的最主要的技术手段。 但事件循环并不是全部的技术手段,比如Promise,虽然受事件循环管理,但是如果没有事件循环,单一Promise依然能实现异步不是吗? 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您
|
5月前
|
监控 JavaScript 前端开发
确定使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript
【10月更文挑战第24天】选择使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript 是一个需要综合考虑多个因素的决策。需要根据脚本之间的依赖关系、页面加载性能要求、脚本的功能和重要性等因素来进行权衡。在实际应用中,需要通过测试和验证来确定最适合的加载方式,以提供更好的用户体验和页面性能。
122 56
|
5月前
|
缓存 JavaScript 前端开发
掌握现代JavaScript异步编程:Promises、Async/Await与性能优化
本文深入探讨了现代JavaScript异步编程的核心概念,包括Promises和Async/Await的使用方法、最佳实践及其在性能优化中的应用,通过实例讲解了如何高效地进行异步操作,提高代码质量和应用性能。
|
5月前
|
前端开发 JavaScript 开发者
除了 async/await 关键字,还有哪些方式可以在 JavaScript 中实现异步编程?
【10月更文挑战第30天】这些异步编程方式在不同的场景和需求下各有优劣,开发者可以根据具体的项目情况选择合适的方式来实现异步编程,以达到高效、可读和易于维护的代码效果。
|
5月前
|
JavaScript
js动画循环播放特效源码(上班族的一天)
js动画循环播放特效是一段实现了包含形象的卡通小人吃、睡、电脑工作的网页动画,js循环动画,简单的画面设计。非常丝滑有意思,欢迎对此代码感兴趣的朋友前来下载参考。
53 2
|
5月前
|
JSON 前端开发 JavaScript
浅谈JavaScript中的Promise、Async和Await
【10月更文挑战第30天】Promise、Async和Await是JavaScript中强大的异步编程工具,它们各自具有独特的优势和适用场景,开发者可以根据具体的项目需求和代码风格选择合适的方式来处理异步操作,从而编写出更加高效、可读和易于维护的JavaScript代码。
67 1
|
6月前
|
JavaScript 前端开发 开发者
掌握Node.js中的异步编程:从回调到async/await
Node.js的异步编程模型是其核心特性之一,它使得开发者能够构建高性能和高并发的应用程序。本文将带你从Node.js的异步编程基础开始,逐步深入到回调函数、Promises、以及最新的async/await语法。我们将探讨这些异步模式的原理、使用场景和最佳实践,并通过实例代码展示如何在实际项目中应用这些概念。
|
6月前
|
JSON 前端开发 JavaScript
探索JavaScript中的Async/Await:简化异步编程的利器
【10月更文挑战第12天】探索JavaScript中的Async/Await:简化异步编程的利器
70 0
|
6月前
|
前端开发 JavaScript UED
深入了解JavaScript异步编程:回调、Promise与async/await
【10月更文挑战第11天】深入了解JavaScript异步编程:回调、Promise与async/await
60 0
|
7月前
|
前端开发 JavaScript 数据库连接
掌握 JavaScript 异步编程:从回调到 Async/Await
在现代 JavaScript 开发中,异步编程是处理非阻塞操作的关键技术。本文从早期的回调函数讲起,逐步过渡到 Promise 和 ES2017 的 async/await 语法,展示了异步编程如何变得更加简洁和强大。通过实用的技巧和最佳实践,帮助开发者避免常见陷阱,提升代码效率和可靠性。
下一篇
oss创建bucket