当前位置:   article > 正文

async function async1() {console.log(‘async1 start‘);await async2();console.log(‘async1 end‘)_async function async1() { console.log("async1 star

async function async1() { console.log("async1 start"); await async2(); conso

async function async1() {console.log('async1 start');await async2();console.log('async1 end')

写出下边程序输出内容:

  1. async function async1() {
  2. console.log('async1 start');
  3. await async2();
  4. console.log('async1 end');
  5. }
  6. async function async2() {
  7. console.log('async2');
  8. }
  9. console.log('script start');
  10. setTimeout(function() {
  11. console.log('setTimeout');
  12. }, 0)
  13. async1();
  14. new Promise(function(resolve) {
  15. console.log('promise1');
  16. resolve();
  17. }).then(function() {
  18. console.log('promise2');
  19. });
  20. console.log('script end');

输出结果:

  1. script start
  2. async1 start
  3. async2
  4. promise1
  5. script end
  6. async1 end
  7. promise2
  8. setTimeout

步骤分析:执行顺序参考这里

  • 首先,事件循环从宏任务(macrostack)队列开始,这个时候,宏任务(整体script、setTimeout、setInterval)队列中,只有一个 script (整体代码)任务 ()。
  • 首先执行 console.log('script start'),输出 ‘script start'
  • 遇到 setTimeout 把 console.log('setTimeout') 放到 macrotask 队列中
  • 执行 aync1() 输出 ‘async1 start' 和 'async2' ,把 console.log('async1 end') 放到 micro 队列中
  • 执行到 promise ,输出 'promise1' ,把 console.log('promise2') 放到  micro 队列中
  • 执行 console.log('script end'),输出 ‘script end'
  • macrotask 执行完成会执行 microtask ,把 microtask quene 里面的 microtask 全部拿出来一次性执行完,所以会输出 'async1 end' 和 ‘promise2'
  • 开始新一轮的事件循环,去除执行一个 macrotask 执行,所以会输出 ‘setTimeout'

 

涉及知识点:

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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/555139
推荐阅读
相关标签
  

闽ICP备14008679号