为什么async函数中两种await方式得出结果顺序不同?
AI 概述
代码如下,为什么 async 函数中两种 await 方式得出结果顺序不同?
function getResult(value,time) {
return new Promise(resolve => {
setTimeout(() => {
console.log(value)
resolve()
}, time)
})
}
(async () => {
await getResult(1,3...

代码如下,为什么 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
})()
我们从后往前看,先看最后一个执行,在 EventLoop 中:
- 会优先执行当前宏任务,结束后再执行宏任务中的微任务。
- 之后再执行下一个宏任务,依次类推。
现在来看最后一段代码:
(async () => {
const a = getResult(3,300)
const b = getResult(4,200)
await a
await b
})()
- 当前的宏任务是函数
getResult:执行 2 次 - 在函数中返回并添加微任务
Promise到队列中,添加了 2 个 - 第一个
await展开当前宏中的Promise微任务队列作为同步顺序执行 - 从第一个
Promise中提取setTimeout宏任务加入队列,300 毫秒后执行 - 从第二个
Promise中提取setTimeout宏任务加入队列,200 毫秒后执行 - 当前宏任务中微任务执行完毕,等待执行下一个宏任务
- 200 毫秒的宏任务优先执行输出 4,并释放第二个
await - 由于第一个
await还未resolve,并且当前宏任务中没有微任务继续往下执行 - 300 毫秒的宏任务开始执行输出 3,并释放第一个
await - 第二个
await开始执行,当前宏任务中已没有需要展开的微任务队列,并且已resolve - 继续往下执行,由于上下文中既没有微任务也没有宏任务,结束执行
以上流程遵循一条原则,即:
await会展开当前所有已队列的异步微任务作为同步函数顺序执行
因此,再来看最后这段代码:
(async () => {
const a = getResult(3,300) // 添加微任务到队列
const b = getResult(4,200) // 添加微任务到队列
await a // 执行所有提交到当前 `promise` 队列,展开作为同步执行
await b // 再次执行,当前宏任务中已没有微任务队列
})()
当 await a 时,已将微任务全部添加到队列。
现在来看第一段有什么不一样:
- 只有当微任务
resolve或reject后,才会完成整个await(async () => { await getResult(1,300) await getResult(2,200) })() - 先执行当前宏任务函数
getResult,添加一个promise微任务队列。 await展开当前宏任务中,微任务队列作为上下文同步执行,这里队列只有 1 个。- 执行
promise微任务并添加一个setTimeout宏任务。 - 当前宏任务中微任务执行完毕,由于还未
resolve,继续执行下一个宏任务。 - 在
setTimeout宏任务中输出 1,并释放第一个await。
因此,第一段和第二段执行顺序的不同,是因为:
await执行时,添加到当前宏任务中的Promise队列不同决定的。
你学废了吗?
以上关于为什么async函数中两种await方式得出结果顺序不同?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 为什么async函数中两种await方式得出结果顺序不同?
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 为什么async函数中两种await方式得出结果顺序不同?

微信
支付宝