Event Loop和宏任务微任务

js是一个单线程语言,所以所有的任务只能排队一个一个去做,这样效率明显很低。
所以event loop就是为解决这个问题而提出的。
在主程序中,分为两个线程,一个运行程序本身,称作主线程,另一个负责主线程和其它线程进行通信(主要是I/O操作),被称作event loop线程
在运行程序的时候,当遇到I/O操作的时候,主线程就让Event loop 线程通知相应的I/O模块去执行,然后主线程接着执行之后的代码,等到I/O结束后,event loop线程再把运行结果交给主线程,然后主线程再执行相应的回调,整个任务结束。

宏任务 微任务
为了让这些任务在主线程上有条不紊的进行,V8采用队列的方式对这些任务进行存储,然后一一取出执行,其中包含了两种任务队列,除了上述提到的任务队列, 还有一个延迟队列,它专门处理诸如setTimeout/setInterval这样的定时器回调任务。
这两种任务队列里的任务都是宏任务
微任务 通常为 应当发生在当前脚本执行完后的事情 做安排,比如对一系列操作做出反应,或者让某些事情异步但是不承担宏任务的代价
微任务的执行有两种方案,一种是等所有宏任务实行完毕然后依次执行微任务,另一种是在执行完一个宏任务之后,检查微任务队列,如果不为空则依次执行完微任务,然后再执行宏任务。
显然后者更满足需求,否则回调迟迟得不到执行,会造成应用卡顿。
常见的宏任务有:setTimeout setTimeInterval
常见的微任务有:"MutationObserver、Promise.then(或.reject) 以及以 Promise 为基础开发的其他技术(比如fetch API), 还包括 V8 的垃圾回收过程"
nextTick
process.nextTick 是一个独立于 eventLoop 的任务队列。
在每一个 eventLoop 阶段完成后会去检查这个队列,如果里面有任务,会让这部分任务优先于微任务执行。

作者:homyeeking
链接:https://juejin.cn/post/6844904199017218055
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/ljh12138/p/14153615.html