美文网首页
Event Loop

Event Loop

作者: Ga611 | 来源:发表于2019-03-22 16:29 被阅读0次
    什么是Event Loop?

    event loop是一个执行模型,在不同的地方有不同的实现。浏览器和NodeJS基于不同的技术实现了各自的Event Loop。

    为什么要有Event Loop?

    因为JavaScript 是单线程的,有了 event loop 的加持,Node.js 和浏览器才可以非阻塞地执行相应操作。

    Node.js的Event Loop

    Node.js的Event Loop分为六个阶段,在此简化为三个阶段:timers、poll、check。每一个阶段都有一个相应的任务队列,并且这三个阶段形成一个环:timers->poll->check->timers
    这三个阶段,poll阶段用于执行对应i/o操作的回调,本文仅讨论当poll队列为空的情况。
    讨论以下情况
    1.当代码出现setTimeout()setTimeout()中的回调放入timers的任务队列中(setInterval()也同理)
    2.当代码出现setImmediate()setImmediate()中的回调放入check的任务队列中
    3.process.nextTick()中的回调不属于这三个阶段中任意一个,我们将其放在当前阶段的后面,在当前阶段的任务队列被清空后,就执行process.nextTick()

    由于setTimeout()回调最短的执行事件也需要4ms(即使第二个参数传入0ms也会被当作4ms),所以一般第一个循环的timers阶段不会有任何回调被执行

    浏览器的Event Loop

    浏览器的事件循环分为两个阶段:宏任务(marco),微任务(micro),两个阶段构成循环。
    讨论以下情况

    1. setTimeout() 中的回调归为宏任务(setInterval同理)
    2. promise.then()中的回调归为微任务
    3. async function中的 await 之后的代码可以被看做promise.then() 中的回调,也归为微任务

    微任务的任务队列不被执行完之前不会进入下个循环,宏任务的任务队列执行多少个任务取决于你在setTimeout中设置的第二个参数,时间已经到了或超时,到了宏任务阶段就被执行掉, 如果没有到时间或超时,即使进入宏任务阶段该任务也不会被执行

    相关文章

      网友评论

          本文标题:Event Loop

          本文链接:https://www.haomeiwen.com/subject/nghrvqtx.html