备注,当修改代码为

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

    执行顺序为

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

    证明一个事实:

    await 后的async函数会先执行,如果没有返回promise,会默认返回一个resolve(undefined)的promise对象,但是此时还没有调用then,会跳出当前await所在的async函数,等到本轮所有其他同步代码执行完毕后,回到await,此时await等同于调用then方法,即将一个微任务推到本轮微任务队列中,所以为什么promise2比async1 end 1先打印,因为打印promise2的那个promise对象先于await执行了then方法,所以它对应的微任务先推进去。