JS异步问题是前端面试绕不过去的一环,下面这道题综合了setTimeout函数、Promise构造函数、微任务、宏任务的考点,一起来看一下吧~
setTimeout( function(){
console.log(1)
}, 0 )
new Promise( function( resolve ) {
console.log( 2 )
for( var i = 0; i < 10000 ; i++ ) {
i === 9999 && resolve()
}
console.log( 3 )
}).then( function() {
console.log( 4 )
} )
console.log( 5 )
我当时面试时没准备,而且当时觉得同步异步这一块乱七八糟理不清楚,索性直接放弃了,直到遇到一家心仪的公司,还没填完个人信息,hr小姐姐就拿来了一套笔试题,其中第一题就是这道异步执行顺序的问题,顿时感觉凉了一半。
首先先来看看我给出的答案:
5、2、4、3、1
有相同脑回路的同学么?
正确答案为
2、3、5、4、1
首先 setTimeout 好,放在等待队列;然后看到 Promise ,好,再放进等待队列;console 可以,直接输出 5,第一个错误就这么出现了。
微任务与宏任务
js中常见的微任务与宏任务有:
微任务:Promise、async/await
宏任务:setTimeout、setInterval、ajax、Dom事件
dom事件其实不是异步操作,但是因为他依赖于eventloop机制,先将它归在这里
首先:微任务的执行时机要比宏任务的早,当看到微任务的关键词时,我们不需要将他放进等待队列,可以当作立即执行