async与await暂停作用
1.
async function Request () {
await new Promise(res => {
setTimeout(() => {
console.log(1)
res()
}, 1000)
})
console.log(4);
new Promise(res => {
setTimeout(() => {
res()
console.log(2);
}, 1000)
}).then(() => console.log(2))
console.log(5);
new Promise(res => {
setTimeout(() => {
console.log(3)
res()
}, 1000)
}).then(() => console.log(3))
}
Request()
// 只有第一个promise暂停了函数的执行
// 因此执行顺序为 1s后打印1,再过1s后打印22 33
// 执行顺序为 等待第一个promise返回结果 => **打印45** ,执行第二个promise,不等待 => 执行第三个promise,不等待 => 第二个promise执行完成,第三个promise执行完成
2.
async function Request () {
await new Promise(res => {
setTimeout(() => {
console.log(1)
res()
}, 1000)
})
await new Promise(res => {
setTimeout(() => {
res()
console.log(2);
}, 1000)
}).then(() => console.log(2))
new Promise(res => {
setTimeout(() => {
console.log(3)
res()
}, 1000)
}).then(() => console.log(3))
}
Request()
// 此时执行为 1s后打印1,再过1s打印22,再过1s打印 33 和三个await结果一致
// 执行顺序为 等待第一个promise返回结果 => *** 打印4 ** 执行第二个promise,等待返回结果 => ** 打印5 **执行第三个promise => 第三个promise执行完成
3.
async function Request () {
await new Promise(res => {
setTimeout(() => {
console.log(1)
res()
}, 1000)
})
await new Promise(res => {
setTimeout(() => {
res()
console.log(2);
}, 1000)
}).then(() => console.log(2))
await new Promise(res => {
setTimeout(() => {
console.log(3)
res()
}, 1000)
}).then(() => console.log(3))
}
Request()
// 此时执行为 1s后打印1,再过1s打印22 再过1s打印33
// 执行顺序为 等待第一个promise返回结果 => 执行第二个promise,等待返回结果 => 执行第三个promise => 等待第三个promise执行完成
同步打印的4,5可以看出函数执行是否被暂停,如果未暂停同步代码会一直执行完,而暂停后会等暂停处,执行完毕才继续执行同步代码
简单来说就是,await会阻塞其后的代码在awit出有结果之后才会继续往后执行.
4. 不同层级嵌套async await
当async进行嵌套之后则可能不会按照自己想要的顺序执行
同层级异步先执行完成,然后是下一层级的异步,依然是按照一个特定顺序
let request = (data, time = 1000) =>
new Promise(resolve => {
setTimeout(() => {
console.log('执行promise', data) // zdz-log
resolve(data)
}, time)
})
let res = ''
async function getDetailData() {
let resArr = []
;[(1, 2, 3)].forEach(async key => {
res = (await request(key, 1000 + 100 * key)) + 'handle' + key
resArr.push(res)
})
return resArr
}
async function getDetailDataNew() {
return await new Promise(resolve => {
let resArr = []
let idArr = [1, 2, 3]
idArr.forEach(async key => {
res = (await request(key, 1000 + 100 * key)) + 'handle' + key
resArr.push(res)
if (resArr.length === idArr.length) {
resolve(resArr)
}
})
})
}
async function getDetailDataNew1() {
let resArr = []
let idArr = [1, 2, 3]
let requestQueue = []
idArr.forEach(key => {
requestQueue.push(request(key))
})
return await Promise.all(requestQueue)
}
let deleteArea = async () => {
let resArr = await getDetailData()
await request(resArr)
}
let deleteAreaNew = async () => {
let resArr = await getDetailDataNew()
console.log(resArr, 'promise 改造后') // zdz-log
}
let deleteAreaNew1 = async () => {
let resArr = await getDetailDataNew1()
console.log(resArr, 'promise all 改造后') // zdz-log
}
deleteArea()
setTimeout(() => {
deleteAreaNew()
}, 1000)
setTimeout(() => {
deleteAreaNew1()
}, 2000)


async与await暂停作用的更多相关文章
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 第十五节:深入理解async和await的作用及各种适用场景和用法
一. 同步VS异步 1. 同步 VS 异步 VS 多线程 同步方法:调用时需要等待返回结果,才可以继续往下执行业务 异步方法:调用时无须等待返回结果,可以继续往下执行业务 开启新线程:在主线程之外 ...
- 深入理解async和await的作用及各种适用场景和用法
https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...
- 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...
- C# 中 async 和 await 的基本使用
C# 中 async 和 await 的基本使用 前言 经常在 C# 的代码中看到以 Async 结尾的方法,大概知道意为异步方法,但不知道怎么使用,也不知道如何定义. 对于"同步" ...
- (译)关于async与await的FAQ
传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的API及性能提升,另外关键字”async” ...
- Async 和 Await的性能(.NET4.5新异步编程模型)
异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...
- 关于async与await的FAQ 转
(译)关于async与await的FAQ 传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的 ...
- async和await关键字实现异步编程
async和await关键字实现异步编程 异步编程 概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...
- 【C#复习总结】 Async 和 Await 的异步编程
谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...
随机推荐
- 浅谈Zabbix与Prometheus区别
Zabbix和Prometheus都是非常流行的监控系统.它们有许多相似之处,但也有一些不同之处.以下是Zabbix和Prometheus监控对比的一些关键点: 1.数据模型和查询语言 Prometh ...
- 【深度学习基础】基于Numpy的循环神经网络实现和反向传播训练
本文是<深度学习进阶:自然语言处理>.<神经网络与深度学习>和<动手学深度学习>的读书笔记.本文将介绍基于Numpy的循环神经网络的前向传播和反向传播实现,包括RN ...
- eclipse错误之Could not write metadata for "xxx"
Could not write metadata for '/test'. 这是由于删除一个项目时,没有同时在硬盘上删除该项目,而后又到硬盘文件系统中删除了该项目,才出现这问题的. 到eclipse工 ...
- Spring Boot自动运行之 CommandLineRunner、ApplicationRunner和@PostConstruct
在使用Spring Boot开发的工作中,我们经常会需要遇到一种功能需求,比如在服务启动时候,去加载一些配置,去请求一下其他服务的接口.Spring Boot给我们提供了三种常用的实现方法: 第一种是 ...
- 记录--H5 实现拍照选景框效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 在实际项目中,遇到了需要唤起手机摄像头拍照的需求,最开始是通过<input type="file" hid ...
- 不用写一行代码!Python最强自动化神器!
1.Playwright介绍 Playwright是一个由Microsoft开发的开源自动化测试工具,它可以用于测试Web应用程序.Playwright支持多种浏览器,包括Chrome.Firefox ...
- logback 日志输出配置
application.properties文件中 logging.config=classpath:logback-spring-dev.xml logback-spring-dev.xml &l ...
- KingbaseES V8R6集群备份恢复案例之---备份初始化“can not find primary node”故障
案例说明: KingbaseES V8R6集群,备库作为repo-path节点,建立类型为'cluster'模式的备份,在执行sys_backup.sh init时,出现"can not f ...
- KingbaseES date 数据类型的两种格式
关于date 数据类型,Oracle 与 PostgreSQL 格式是不同的,Oracle 是 日期 + 时间的类型,而PG 则只有日期.KingbaseES Oracle 模式则同时实现了二者类型, ...
- 基于rv1126 rkmeida 一路多出 原理
基于rv1126 rkmeida 一路多出的坑 首先说要的是介绍一下rkmedia 相关内容 RKMedia提供了一种媒体处理方案,可支持应用软件快速开发.RKMedia在各模块基础API上做进一 ...