浏览器事件循环

macrotask:(宏任务) sccript(整体代码) setTimeout, setInterval, setImmdiate, I/O UI rendering

microtask:(微任务) process.nextTick,Promises,Object.observe,MutationObserver

 

 

单线程就意味着所有任务需要排队,如果因为任务cpu计算量大还好,但是I/O操作cpu是闲着的,所以js就设计成了一门异步的语言,不会做无畏的等待,任务可以分成两种,一种是同步任务,另一种是异步任务。

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context(stack))

  (2)  主线程之外,还存在一个“任务队列”,只要异步任务有了运行结果,就在“任务队列”之中放置一个事件

(3)一旦“执行栈”中的所有同步任务执行完毕,系统就会读取“任务对列”,看看里面有哪些事件,哪些对应的异步任务

(4)主线程不断重复上面的第三步

 //    setTimeout(()=>{
            //        console.log("setTimeout");
            //    },0)
             
            //     Promise.resolve().then(()=>{
            //         console.log("promise");
            //         Promise.resolve().then(()=>{
            //              console.log("promise2")
            //         })
            //     })

            //     console.log("main")



         执行结果 main     promise    promise2  setTimeout
                               

  

 setTimeout(()=>{
                Promise.resolve().then(()=>{
                    console.log("promise")
                })
            },0)

            Promise.resolve().then(()=>{
                setTimeout(()=>{
                    console.log("setTimeout")
                },0)
            })

            console.log("main")

     执行 结果  main  promise setTimeout

 

                                 I/0

 主线        宏任务   微任务    宏任务  微任务  ....

 

事件循环:每执行完一轮宏任务和微任务就叫做一环事件

 

宏任务和微任务理解

执行顺序是同步代码>微任务>宏任务,程序执行,限制执行同步代码,遇到微任务(resolve())进入微任务队列中,优先执行微任务,遇到宏任务进入函数调用栈中的指向的任务成为宏任务,按顺序弹出执行;一次CPN轮询下,先执行同步代码,将微任务队列中的任务全部执行完成,再按顺序执行函数调用栈中的宏任务。

 

posted @ 2022-03-10 16:00  踏浪小鲨鱼  阅读(62)  评论(0)    收藏  举报