博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习JavaScript循环下的async/await
阅读量:5953 次
发布时间:2019-06-19

本文共 1316 字,大约阅读时间需要 4 分钟。

问题描述

在进行业务开发的过程中,使用了数组的高级函数map,同时使用了ES6语法async/await,发现在map循环下任务是异步执行的,并不符合预期

例子说明

/** * 异步打印数据 */const echo = async (i) => {    return new Promise((resolve,reject)=>{        setTimeout(() => {            console.log('i===>', i,new Date().toLocaleTimeString());            resolve(i) ;        }, 100);    })}/** * 模拟异步任务 */const task = async () => {    dataArr.forEach( async( item, i ) => {        await echo(i);    })}/** * 启动函数入口 */const run = async () => {    console.log('run-start====>date:', new Date().toLocaleDateString())    await task() ;    console.log('run-end======>date:', new Date().toLocaleDateString())}/*** 启动函数*/(async () => {    console.log('start...')    await run();    console.log('end...')})()//预期效果start...run-start====>date: 2019-2-16i===> 0 23:19:04i===> 1 23:19:04i===> 2 23:19:04i===> 3 23:19:04run-end======>date: 2019-2-16end...//打印结果start...run-start====>date: 2019-2-16run-end======>date: 2019-2-16end...i===> 0 23:19:04i===> 1 23:19:04i===> 2 23:19:04i===> 3 23:19:04

从上面的例子可以看出,在map循环下使用await后, 函数结束标志信号run-end先于异步任务数据i输出,故task任务仍然是异步执行,并不符合预期。原因是Array的循环方法map、forEach、filter、reduce、some、every等是并行迭代,可以理解为async/await的效果是无效的

解决方案

  • 使用最原始的for循环
  • for...of

将上述的模拟异步任务修改为

for (var i = 0; i < dataArr.length; i++) {     await echo(i) } 或 for (const i of dataArr) {     await echo(i) }

参考连接

转载地址:http://ojoxx.baihongyu.com/

你可能感兴趣的文章
leetcode - Search in Rotated Sorted Array II
查看>>
coursera课程Text Retrieval and Search Engines之Week 2 Overview
查看>>
如何导出已有的谷歌插件,又如何把导出的插件安装到360浏览器中,又如何对插件小修小改?...
查看>>
[PWA] Enable Push Notification in your web app
查看>>
【转载】JS中bind方法与函数柯里化
查看>>
隐藏与显示铵钮
查看>>
zookeeper常用命令
查看>>
不懂圣杯布局?5种方式包教包会
查看>>
基于React跑一个简易版九宫格抽奖
查看>>
iOS 开发资源汇总 肯定有你想要的资源(Continuously updated)
查看>>
微信小程序横向(scroll x)滚动 scroll view
查看>>
如何重置 Docker 里的 gitlab root 用户密码
查看>>
电商系统设计之商品 (下)
查看>>
《Flask 入门教程》第 3 章:模板
查看>>
关于移动安全的一点总结
查看>>
mac flutter 开发环境配置 从0到1 流程
查看>>
为什么需要一个激励函数
查看>>
CSS布局
查看>>
generator异步
查看>>
使用Remix编译和部署以太坊智能合约
查看>>