关于await的神奇(不懂)之处,望解惑!

async function asyncTest() {
    console.log('hi')
    await setTimeout(()=>{
        console.log('hello')
    }
    , 3000);
    console.log('red')
}
asyncTest();
console.log('blue')

这是一个普通的async/await组合代码, 打印的顺序是hi, blue, red, hello.

但是我们如果将asyncTest()改为await (asyncTest()), 那么神奇的顺序变成了hi, red, blue, hello

当然,电脑是不会骗我们的,所以请问各位大佬,这是为什么呢?

阅读 1.5k
1 个回答

setTimeout 打印的 hello 在 3 秒之后,我们忽略它。
这样只剩下 hi, blue, red <-> hi, red, blue
我们发现 hi 都在开始。因为无论如何,asyncTestawait 语句前的部分肯定是首先调用的。
又注意到 setTimeout 返回一个整数,也就是说 await 了个寂寞。
这样问题就变成了

await (async () => {
    await 1
    console.log("after await") // 我先
})()
console.log("after async")

<->

(async () => {
    await 1
    console.log("after await")
})()
console.log("after async") // 我先

假如我们去掉 await 1,会发现都是 after await 先打印。
也就是说 asyncTestawait 导致它后面的代码被扔进了任务队列中。
假如不加 await 调用 asyncTest同步after await 执行完,才会执行异步的任务队列。
但加了 await,就把异步操作转化为同步操作,先执行任务队列了。

最近刚刚梳理清楚,可能有错处。
这篇 讲的比我好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题