Call stack(执行栈):
Script start - 第一轮主线程
==>await async2() ===> 第一轮让出线程
Async2 end - 第一轮主线程
==> setTimeout ==> 到宏任务队列
promise - 第一轮主线程
promise1 ==> 第一轮到微任务队列
promise2 ==> 第一轮到微任务队列
script end - 第一轮主线程
第一轮结束:
同步代码执行完毕
script start
Async2 end
Promise
Script end
此时宏任务队列中只有一个 setTimeout
微任务队列中有:
promise1
promise2
开始执行异步代码(从代码开始位置开始循环):
还剩await async2() 没有执行完, 返回promise的resolve函数
==> return new Promise(resolve = > {
resolve()
}).then() {
‘async1 end’ ==> 第二轮到微任务队列
}
第二轮已经没有可执行的代码了, 循环结束
此时微任务队列中有:
promise1
promise2
async1 end
开始从任务队列中取任务执行
先从微任务队列取:
promise1
Promise2
Async1 end
微任务队列执行完毕, 再从宏任务中取:
setTimeout
所以代码执行顺序为:
script start
async2 end
Promise
script end
promise1
promise2
async1 end
setTimeout