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 的异步编程
谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...
随机推荐
- vite启动dev的项目,在nginx做代理的时候,二级目录尾要加/
vite启动dev的项目,在nginx做代理的时候,二级目录尾要加/ vite dev开发启动的时候, url最后不加/,系统不能使用,所以代理的时候,没加/,代理跳转过去,就回导致页面加载不出来,j ...
- vscode 切换主侧栏可见性 原Ctrl+B 我改为了 Alt+P
vscode 切换主侧栏可见性 原Ctrl+B 我改为了 Alt+P ctrl+b 总是想不起来
- vm 虚拟机总是蓝屏 移除打印机和声卡 移除这俩硬件 (大文件用飞秋传输)
vm 虚拟机总是蓝屏 移除打印机和声卡 移除这俩硬件 (大文件用飞秋传输)
- Navicat 通过 Http通道 连接远程 Mysql
https://jingyan.baidu.com/article/3d69c551aa54dff0cf02d7a0.html 注意本机ip填写 localhost
- manjaro配置软件源
sudo pacman-mirrors -i -c China -m rank从中选择最快的软件源!
- day16--Java常用类04
Java常用类 4.字符串相关类练习 4.1StringBuilder练习 package li.normalclass.stringbuilder; public class TestBuffer ...
- vim的使用进步
vim的使用进步 1.如果遇到命令行中无法退出的 狂按esc按键 或者也可以使用v模式下切换一下,之后按esc 保存退出 保存退出--:wq 保存:w 不保存退出:q! i--插入模式 v- 可视化模 ...
- 调试3D渲染和3D可视化的五个好处
建筑和建筑环境是我们日常生活中不可避免的一部分,直接影响我们和我们的福祉.它可以是我们的家.办公室.附近的教堂或城市的商业综合体;所有这一切的设计和规划都是建筑.然而,具有讽刺意味的是,建筑的交流往往 ...
- drf(请求和响应)
一 请求 源码分析 from rest_framework.request import Request class Request: def __init__(self, request, pars ...
- 介绍几款WPF应用的UI库
在WPF中对于前端页面的书写,我们有现成的UI类库,不需要我们自己再去写 我这里介绍几款 1.MahApps 官网 https://mahapps.com/ 使用,在App.xaml中添加 <A ...