博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解promise、async和await的执行顺序
阅读量:7125 次
发布时间:2019-06-28

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

说明:

本文摘自 

1、题目和答案

一道题题目:下面这段promise、async和await代码,请问控制台打印的顺序?

async function async1(){  console.log('async1 start')  await async2()  console.log('async1 end')}async function async2(){  console.log('async2')}console.log('script start')setTimeout(function(){  console.log('setTimeout') },0)  async1();new Promise(function(resolve){  console.log('promise1')  resolve();}).then(function(){  console.log('promise2')})console.log('script end')复制代码

上述,在Chrome 66node v10中,正确输出是:

script startasync1 startasync2promise1script endpromise2async1 endsetTimeout复制代码

2、知识点

显然,这考察的是js中的事件循环和回调队列。注意以下几点:

  • Promise优先于setTimeout宏任务。所以,setTimeout回调会在最后执行。
  • Promise一旦被定义,就会立即执行。
  • Promiserejectresolve是异步执行的回调。所以,resolve()会被放到回调队列中,在主函数执行完和setTimeout前调用。
  • await执行完后,会让出线程。async标记的函数会返回一个Promise对象

3、 难点

最令人困惑的,就是async1 endpromise2之后输出

在函数async1中,执行promise

由于
async2
async标记的函数,所以默认返回
promise对象
)会发现
resolve(),然后放入回调队列。

接着执行下方的new Promise中的resolve()输出promise2,再回来输出async1 end

其中,async1函数可以写成以下方式(便于理解):

async function async1(){  console.log('async1 start')  async2().then( _ => {    console.log( 'async1 end ')  })}复制代码

3、流程

  1. console.log('script start')输出:script start
  2. setTimeout被放在最后调用
  3. 执行async1函数,输出async1 start。然后,进入async2函数,输出async2,并返回Promise对象。回到async1,由于await,让出线程,async2函数返回的Promise放在回调队列
  4. 新new了一个Promise对象,输出promise1。其中的resolve()被放在回调队列。
  5. console.log('script end')输出:script end
  6. 执行回调队列中,async1返回的Promise对象,对象产生的resolve被放入对调队列。这里不输出任何值。
  7. 执行回调队列中,下方Promise显式声明的resolve,输出promise2
  8. 执行回调队列中,由于async1函数返回的promise对象的resolve,输出async1 end
  9. 执行回调队列中,最后的setTimeout,输出setTimeout
  10. finish

转载于:https://juejin.im/post/5c517876f265da615705ddf6

你可能感兴趣的文章
fsck检查和修复文件系统
查看>>
利用scp 远程上传下载文件/文件夹和ssh远程执行命令
查看>>
精装友好联络算法实现借壳和RI
查看>>
oralce错误总结
查看>>
css 浏览器兼容性问题解决
查看>>
Hyperworks、Nastran、Abaqus与ansys的区别
查看>>
boxfilter 实现
查看>>
Android如何设置标题栏的高度
查看>>
IOS开发之功能模块--自定义UITabBarViewController的备用代码
查看>>
CRM项目测试第一天
查看>>
HDU1160(LIS)
查看>>
文件压缩,解压缩的方法
查看>>
于Eclipse在建筑cocos2d-x的Android开发环境(避免cygwin)
查看>>
ionic list item-radio checked
查看>>
教你10分钟内在Windows上完成Rails开发环境的安装和配置
查看>>
Memcached 笔记与总结(3)安装 php-memcache(windows 系统下)
查看>>
【C++】智能指针auto_ptr简单的实现
查看>>
ContextLoaderListener作用详解
查看>>
**IOS:xib文件解析(xib和storyboard的比较,一个轻量级一个重量级)
查看>>
数据结构-线性表-栈
查看>>