关于async await promise 在使用中执行顺序的疑问

    var aaa=function(data){
        bbb().then(()=>{
            console.log(4)
        })
        console.log(3)
    }

    var bbb= async function (){
        console.log(1)
        await ccc();
        console.log(2)
    }

    var ccc=function(){
        console.log(5)
    }
    
    aaa() // 1 5 3 2 4

输出结果是 1 5 3 2 4
为什么不是 1 5 2 3 4 ?

阅读 1.4k
2 个回答

整体流程是这样的。aaa整个执行流程分为3个同步代码段。
1:进入aaa->进入bbb->log(1)->进入ccc->log(5)->遇到await,bbb挂起退出到aaa->注册then回调->log(3)->aaa执行完毕退出
2:事件循环调起bbb继续执行->log(2)->bbb执行完毕退出
3:事件循环调起then回调->log(4)->执行完毕退出

所以是15324,其中很关键的一点就是async方法执行到await后会主动挂起等待调度。

题主的疑问无非是为什么输出32,而不是23.
因为输出3的地方是同步代码,不需要等待任何一个异步操作的fullfilled状态。
输出2的地方是异步的,必须等到await ccc()执行结束才能运行,也就是要等到ccc()切换到fullfilled状态才能继续进行。
所以要先3再2

推荐问题