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
。
当然,电脑是不会骗我们的,所以请问各位大佬,这是为什么呢?
setTimeout
打印的hello
在 3 秒之后,我们忽略它。这样只剩下
hi, blue, red
<->hi, red, blue
我们发现
hi
都在开始。因为无论如何,asyncTest
中await
语句前的部分肯定是首先调用的。又注意到
setTimeout
返回一个整数,也就是说await
了个寂寞。这样问题就变成了
<->
假如我们去掉
await 1
,会发现都是after await
先打印。也就是说
asyncTest
中await
导致它后面的代码被扔进了任务队列中。假如不加
await
调用asyncTest
,同步的after await
执行完,才会执行异步的任务队列。但加了
await
,就把异步操作转化为同步操作,先执行任务队列了。最近刚刚梳理清楚,可能有错处。
这篇 讲的比我好。