- 对于事件循环和宏工作微工作,这篇文章中讲的很清晰:
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两个场景的后果就一样了