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 的异步编程
谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...
随机推荐
- C++容器博客汇总
文章的原作者为 https://blog.csdn.net/qq_37529913?type=blog C++ STL 容器.迭代器.适配器(深入了解,一文学会) 1.STL容器 2.序列式容器 ...
- pyecharts + Django你不知道这个架构有多美
pyecharts + Django你不知道这个架构有多美 何为echarts? pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS ...
- day01-项目介绍与环境搭建
项目介绍与环境搭建 1.项目学习前置知识 Java基础知识 javaweb MySQL SpringBoot SSM(Spring,SpringMVC,MyBatis) Maven 2.学习收获 了解 ...
- [模板]01trie,维护异或最大值
// 查询异或最大值,每次插入和查询时间都是log(C) template<class T> class trie01 { vector<vector<T>> tr ...
- 遇到百张数据表也不怕,Java自动生成实体、Controller、DAO、Service以及Service实现类
一.说明 该工具类实现以下功能: 1.简单的controller方法 2.自动生成Dao类 2.自动生成Service类 2.自动生成ServiceImpl类 二.连接数据库 // 数据库配置信息 p ...
- 优化您的部署:Docker 镜像最佳实践
介绍 在快速发展的软件开发和部署领域,Docker 已成为容器化的强大工具,为打包.分发和运行应用程序提供了一种标准化的高效方式.Docker 镜像在这一过程中发挥着至关重要的作用,是容器化应用程序的 ...
- 你是怎么理解ES6中Module的?使用场景?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 模块,(Module),是能够单独命名并独立地完成一定功能的程序语句的集合(即程序代码和数据结构的集合体). 两个基本的特征:外 ...
- CentOS7.5安装JDK8
1.下载地址 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 2.创建文件夹 mkdir /usr/java 3 ...
- C# URL参数编码
string s = "lw123abc测试信息!@#¥%--&*()--+"; Console.WriteLine("原数据:\t\t" + s); ...
- wire和reg型变量的组合使用
模型功能 实现寄存器之间的连线 实现寄存器的声明 建构时钟的时序系统 模型框图 `timescale 1ns / 1ps /* */ // ****************************** ...