async函数中为什么如下两种await方式得出结果顺序不同?
function getResult(value,time) {
return new Promise(resolve => {
setTimeout(() => {
console.log(value)
resolve()
}, time)
})
}
(async () => {
await getResult(1,300)
await getResult(2,200)
})()
(async () => {
const a = getResult(3,300)
const b = getResult(4,200)
await a
await b
})()
又看了一遍async await原理还是没明白,求大佬解答
从后往前看吧,先看最后一个执行,在
EventLoop
中现在来看最后一段代码:
getResult
:执行 2 次Promise
到队列中,添加了 2 个await
展开当前宏中的Promise
微任务队列作为同步顺序执行Promise
中提取setTimeout
宏任务加入队列,300 毫秒后执行Promise
中提取setTimeout
宏任务加入队列,200 毫秒后执行await
await
还未resolve
,并且当前宏任务中没有微任务继续往下执行await
await
开始执行,当前宏任务中已没有需要展开的微任务队列,并且已resolve
以上流程遵循一条原则,即:
await
会展开当前所有已队列的异步微任务作为同步函数顺序执行因此,再来看最后这段代码:
当
await a
时,已将微任务全部添加到队列现在来看第一段有什么不一样:
resolve
或reject
后,才会完成整个await
getResult
,添加一个promise
微任务队列await
展开当前宏任务中,微任务队列作为上下文同步执行,这里队列只有 1 个promise
微任务并添加一个setTimeout
宏任务resolve
,继续执行下一个宏任务setTimeout
宏任务中输出 1,并释放第一个await
以上步骤中第二个
promise
微任务还没有添加到队列,只有当第一个await
结束之后,才开始订阅下一个微任务,执行过程和上面一致因此,第一段和第二段执行顺序的不同,是因为:
await
执行时,添加到当前宏任务中的Promise
队列不同决定的