JS异步执行顺序机制总结

159 阅读1分钟

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小姐姐就拿来了一套笔试题,其中第一题就是这道异步执行顺序的问题,顿时感觉凉了一半。

首先先来看看我给出的答案:

52431

有相同脑回路的同学么?

正确答案为

23541

首先 setTimeout 好,放在等待队列;然后看到 Promise ,好,再放进等待队列;console 可以,直接输出 5,第一个错误就这么出现了。

微任务与宏任务

js中常见的微任务与宏任务有:

微任务:Promise、async/await
宏任务:setTimeout、setInterval、ajax、Dom事件
dom事件其实不是异步操作,但是因为他依赖于eventloop机制,先将它归在这里
首先:微任务的执行时机要比宏任务的早,当看到微任务的关键词时,我们不需要将他放进等待队列,可以当作立即执行