• 对于事件循环和宏工作微工作,这篇文章中讲的很清晰:

https://blog.csdn.net/Liu_yunzhao/article/details/90734257

文中提到一段代码的执行程序

console.log("script start");new Promise(function (resolve) {  console.log("promise1");  resolve();}).then(function () {  console.log("promise1-then");});setTimeout(function () {  console.log("settimeout1");}, 0);async function async1() {  console.log("async1 start");  let resulet = await async2();  console.log(resulet);  console.log("async1 end");}async function async2() {  console.log('async2');  return "async2 return"}setTimeout(function () {  console.log("settimeout2");}, 0);async1();new Promise(function (resolve) {  console.log("promise2");  resolve();}).then(function () {  console.log("promise2-then");});console.log('script end');

在node中和浏览器中有所不同:
// nodejs

script startpromise1async1 startasync2promise2script endpromise1-thenpromise2-thenasync2 returnasync1 endsettimeout1settimeout2

// chrome

script startVM7991:4 promise1VM7991:15 async1 startVM7991:22 async2VM7991:33 promise2VM7991:39 script endVM7991:7 promise1-thenVM7991:17 async2 returnVM7991:18 async1 endVM7991:36 promise2-thenundefinedVM7991:11 settimeout1VM7991:27 settimeout2

能够看到async的程序不同,对于这个问题,次要是因为新旧版本v8优化形式的不同,具体可见这篇文章:
https://www.zhihu.com/question/268007969/answer/341146726
总的老说就是如果在async2中的console前也加上await两个场景的后果就一样了