浏览器事件循环
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轮询下,先执行同步代码,将微任务队列中的任务全部执行完成,再按顺序执行函数调用栈中的宏任务。

浙公网安备 33010602011771号