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暂停作用的更多相关文章

  1. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  2. 第十五节:深入理解async和await的作用及各种适用场景和用法

    一. 同步VS异步 1.   同步 VS 异步 VS 多线程 同步方法:调用时需要等待返回结果,才可以继续往下执行业务 异步方法:调用时无须等待返回结果,可以继续往下执行业务 开启新线程:在主线程之外 ...

  3. 深入理解async和await的作用及各种适用场景和用法

    https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...

  4. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  5. C# 中 async 和 await 的基本使用

    C# 中 async 和 await 的基本使用 前言 经常在 C# 的代码中看到以 Async 结尾的方法,大概知道意为异步方法,但不知道怎么使用,也不知道如何定义. 对于"同步" ...

  6. (译)关于async与await的FAQ

    传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的API及性能提升,另外关键字”async” ...

  7. Async 和 Await的性能(.NET4.5新异步编程模型)

    异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...

  8. 关于async与await的FAQ 转

    (译)关于async与await的FAQ 传送门:异步编程系列目录…… 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰富的 ...

  9. async和await关键字实现异步编程

    async和await关键字实现异步编程 异步编程   概念 异步编程核心为异步操作,该操作一旦启动将在一段时间内完成.所谓异步,关键是实现了两点:(1)正在执行的此操作,不会阻塞原来的线程(2)一旦 ...

  10. 【C#复习总结】 Async 和 Await 的异步编程

    谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...

随机推荐

  1. 接入移动手机号一键登录类的封装,app应用,php服务端类的封装与调用

    需求:实现手机号一键登录,由于官方只有java的demo和jar包,没有php的sdk及demo <?php/* * 手机号一键登录加解密 */class Autophone{ const A_ ...

  2. vscode 文件上传快捷键 shift+alt+s (ftp专用)插件用的 ftp-sync

    vscode 文件上传快捷键 shift+alt+s (ftp专用)插件用的 ftp-sync { "key": "shift+alt+s", "co ...

  3. docker跑es流程再整理

    参考,欢迎点击原文:https://blog.csdn.net/qq_32101993/article/details/100021002(报错) 继老早前一篇文章整理的使用docker-compos ...

  4. MyEclipse之各个版本的区别

    跟Eclipse一样,MyEclipse的各个版本也是有区别的,他们所集成的插件是不同的. 从插件数量和功能的强大程度上讲:Blue>Professional>Standard MyEcl ...

  5. ffmpeg播放器-音视频解码流程

    目录 音视频介绍 音视频解码流程 FFmpeg解码的数据结构说明 AVFormatContext数据结构说明 AVInputFormat数据结构说明 AVStream数据结构说明 AVCodecCon ...

  6. getClass()方法----getName()方法

    public class Test { public static void main(String[] args) { Person p = new Person(1,"刘德华" ...

  7. 活动报名|3DCAT实时渲染云行业生态合作系列沙龙之“云XR如何赋能虚拟仿真实验教学”线上活动邀您参会

    当前,虚拟现实发展方兴未艾,"XR+教育"融合发展前景广阔. 3DCAT实时渲染云积极联动教育行业渠道商等生态合作伙伴,合力打造"虚拟现实实验室"." ...

  8. python面向对象编程(封装、隐藏)

    一 封装 1.封装介绍封装是面向对象三大特性最核心的一个特性封装<----->整合2.将封装的属性进行隐藏操作1).如何隐藏:在属性名前加__前缀,就会实现一个对外隐藏属性效果该隐藏需要注 ...

  9. 三维模型OBJ格式轻量化的跨平台兼容性问题分析

    三维模型OBJ格式轻量化的跨平台兼容性问题分析 三维模型的OBJ格式轻量化在跨平台兼容性方面具有重要意义,可以确保模型在不同平台和设备上的正确加载和渲染.本文将分析OBJ格式轻量化的跨平台兼容性技术, ...

  10. 爬虫实战:探索XPath爬虫技巧之热榜新闻

    之前我们已经详细讨论了如何使用BeautifulSoup这个强大的工具来解析HTML页面,另外还介绍了利用在线工具来抓取HTTP请求以获取数据的方法.在今天的学习中,我们将继续探讨另一种常见的网络爬虫 ...