当前位置:   article > 正文

async await 的执行顺序问题_async await 执行顺序

async await 执行顺序

 先看两个示例体现的问题

  1. async function async1() {
  2.   console.log("2");
  3.   await async2();
  4.   console.log(23132);
  5.   await async3();
  6.   console.log("3");
  7. }
  8. async function async2() {
  9.   console.log("4");
  10.   await async4();
  11. }
  12. async function async3() {
  13.   console.log("5");
  14. }
  15. async function async4() {
  16.   console.log("6");
  17. }
  18. async1();
  19. setTimeout(function () {
  20.   console.log("setTimeout");
  21. }, 0);
  22. new Promise((resolve) => {
  23.   console.log("Promise");
  24.   resolve();
  25. })
  26.   .then(function () {
  27.     console.log("promise1");
  28.   })
  29.   .then(function () {
  30.     console.log("promise2");
  31.   });
  32. console.log("7");
  33. 结果//
  34. 2
  35. 4
  36. 6
  37. Promise
  38. 7
  39. promise1
  40. 23132
  41. 5
  42. promise2
  43. 3
  44. setTimeout
  1. async function async1() {
  2.   console.log("2");
  3.   await async2();
  4.   console.log(23132);
  5.   await async3();
  6.   console.log("3");
  7. }
  8. async function async2() {
  9.   console.log("4");
  10.   // await async4();取消了第二层的await
  11. }
  12. async function async3() {
  13.   console.log("5");
  14. }
  15. async function async4() {
  16.   console.log("6");
  17. }
  18. async1();
  19. setTimeout(function () {
  20.   console.log("setTimeout");
  21. }, 0);
  22. new Promise((resolve) => {
  23.   console.log("Promise");
  24.   resolve();
  25. })
  26.   .then(function () {
  27.     console.log("promise1");
  28.   })
  29.   .then(function () {
  30.     console.log("promise2");
  31.   });
  32. console.log("7");
  33. 结果/
  34. 2
  35. 4
  36. Promise
  37. 7
  38. 23132
  39. 5
  40. promise1
  41. 3
  42. promise2
  43. setTimeout

两次代码仅有一行不同,导致结果不同

我们知道async隐式返回 Promise 作为结果的函数,那么可以简单理解为,await后面的函数执行完毕时,await会产生一个微任务(Promise.then是微任务)。但是我们要注意这个微任务产生的时机,它是执行完await之后,直接跳出async函数,执行其他代码(此处就是协程的运作,A暂停执行,控制权交给B)。其他代码执行完毕后,再回到async函数去执行剩下的代码,然后把await后面的代码注册到微任务队列当中。

遇到await就切换协程,执行await后面的函数,并顺序执行下面的宏任务,

执行到底后,执行微任务

再返回到await位置,执行下一行函数,循环上述内容

所以示例一的执行顺序为:

 宏任务和微任务的执行结构如下表

 

 

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

闽ICP备14008679号