一道经典的考察事件循环、宏任务、微任务的js题

一道经典的考察事件循环、宏任务、微任务的js题 

async function async1(){
	console.log('async1 start')
	await async2()
	console.log('async1 end')
}
async function async2(){
	console.log('async2')
}
console.log('script start')
setTimeout(function(){
	console.log('setTimeout') 
},0)  
async1();
new Promise(function(resolve){
	console.log('promise1')
	resolve();
}).then(function(){
	console.log('promise2')
})
console.log('script end')

先上正确答案:

那为什么答案是这样的呢?

第一步肯定是打印script start这不用说;

第二步执行到setTimeout时,它是一个宏任务,它会等当前宏任务全部执行完毕后再执行;

第三步执行到async1函数时,会先打印出async1 start,然后打印出async2,因为async定义的函数会立即执行,async2会返回一个promise的微任务进入回调队列线程;

第四步执行到new Promise时,会打印出promise1,同样resolve()会返回一个微任务进入回调队列线程;

第五步就打印出script end,到此时同步的都已经执行完毕,然后主线程会去回调队列线程拉任务;

第六步主线程拉到第一个任务是async2返回的一个promise,又会碰到一个resolve(),这时又将其推入回调队列线程;

第七步拉到new Promise的resolve(),这时会打印出promise2

第八步就是打印出async1 end

第九步就是当前宏任务执行完毕,执行下一个宏任务setTimeout,打印出setTimeout

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值