javascript中的宏任务和微任务(二)
js事件轮询执行顺序总结:
1)所有的同步任务都在主线程上执行,行成一个执行栈。
2)除了主线程之外,还存在一个任务列队,只要异步任务有了运行结果,就在任务列队中植入一个时间标记。
3)主线程完成所有任务(执行栈清空),就会读取任务列队,先执行微任务队列在进行DOM渲染,最后执行宏任务队列。
4)重复执行上面步骤
为什么微任务比宏任务先触发?
宏任务:Dom渲染后触发,如settimeout
微任务:Dom渲染前触发,如promise
1 2 3
上面可以看出dom渲染在微任务之后,宏任务之前
看一个宏任务微任务执行顺序的面试题目
1 async function async1(){ 2 console.log('async1 start') //异步函数声明就会同步执行 2 3 await async2() 4 //后面都是异步回调callback的内容 是微任务的回调 5 console.log('async1 end') //6 6 } 7 async function async2(){ 8 console.log('async2') //异步函数声明就会同步执行 3 9 } 10 console.log('script start') //1 11 12 setTimeout(()=>{ //宏任务 setTimeout进入webapis等待 13 console.log('setTimeout') //8 14 }) 15 16 async1() 17 18 new Promise((resolve)=>{ 19 console.log('promise1') //4 promise函数初始化声明会同步执行 20 resolve() 21 }).then(()=>{ 22 console.log('promise2') //7 23 }) 24 console.log('script end') //5