关于promise结合async和await执行顺序问题
来源:4-7 Promise的静态方法
断了木马牛的李淳罡
2022-01-26
setTimeout(() => console.log(4))
async function test() {
console.log(1)
await Promise.resolve()
console.log(3)
}
test()
console.log(2)
谢老师新年好,请问为什么输出 1 2 3 4
2回答
-
谢成
2022-01-27
这个考察的是事件循环机制Event Loop处理宏任务和微任务的理解。
setTImeout是宏任务,Pormise是微任务。
async function test() {
console.log(1)
await Promise.resolve()
console.log(3)
}test()
可以改写为:
console.log(1)
Promise.resolve.then(()=>{
console.log(3)
})
所以问题的中的代码可以改写成:
setTimeout(() => console.log(4))
console.log(1)
Promise.resolve.then(()=>{
console.log(3)
})
console.log(2)
1、首先浏览器执行js进入第一个宏任务进入主线程, 遇到 setTimeout 分发到宏任务事件队列中
2、遇到console.log(1)输出1
3、遇到Pormise,执行then 被分发到微任务事件队列中
4、遇到console.log(2)输出2
5、第一轮宏任务结束,所以执行第一轮的微任务也就是console.log(3)
6、第一轮微任务执行完毕,执行第二轮宏任务,打印setTimeout里面内容
112022-01-27 -
谢成
2022-01-27
也可以看下这个:
链接: https://pan.baidu.com/s/10MGxpfAWLMbwFdFbL1MPSw 提取码: 3a9w
00
相似问题