事件循环

48 阅读1分钟

js单线程

我们知道JavaScript是单线程,就是任务或者代码将要按顺序执行,但是在我们写的代码中可能存在Dom操作,导致线程无法进行或者说阻塞。所有js采用的是单线程

同步异步

我们将js代码分为同步代码和异步代码,js将异步代码放到宿主环境去执行。在浏览器中就是WebApis。然后自身继续在执行栈中执行同步代码,注意此时异步代码在浏览器中也会被执行,当异步任务有了结果后比如setTimeout的等待时间,promise的状态,将会进入任务队列。

事件循环+宏任务+微任务

任务队列又分为宏任务和微任务。
宏任务:script,setTimeout,setInterval, setImmediate,i/o,UIrendering
微任务:process.nextTick,Promise.then等
宏任务将会进宏任务队列,微任务进入微任务队列。
当执行栈为空时,浏览器的事件循环机制将会把任务队列中的事件加入到执行栈中,注意先执行宏任务然后再清空此次的微任务队列,再继续执行下一个宏任务,再清空微任务。不断将任务队列中的事件加入执行栈,这整个过程就是事件循环。

    new Promise((resolve,reject)=>{
        setTimeout(function(){
            console.log("1")
            resolve()
            },2000)
    .then(res=>{console.log("2")})
    //1
    //2
    //因为中执行promise中有宏任务setTimeout等2秒后再放入宏队列,同理then要等promise的状态变才会放入微任务队列。