York's Blog

Event Loop

js引擎(单线程)同一时间只做一件事
但是可以调用其他线程帮js做事
js引擎

Event Loop、计时器、nextTick

Node.js Event Loop
处理回调信息
event loop是node.js使用c语言的代码
当 Node.js 启动时,会做这几件事

  1. 初始化 event loop
  2. 开始执行脚本(或者进入 REPL)。这些脚本有可能会调用一些异步 API、设定计时器或者调用 process.nextTick()
  3. 开始处理 event loop

每一个阶段都有队列
timers阶段,处理setTimeout和setInterval里面到时的回调
poll阶段(轮询阶段),停留这个阶段,什么都干除了timers阶段和check阶段的事,除了timers的回调,其他都是poll处理
poll 阶段有两个功能:

  1. 如果发现计时器的时间到了,就绕回到 timers 阶段执行计时器的回调。
  2. 然后再执行 poll 队列里的回调。
    check阶段,只处理一个API,大部分情况setImmediate()比setTimeout先执行,只有第一次轮询是例外的
    如果执行脚本到处理Event loop之间的时间超过4ms。计时器在第一次检查的时候就会被执行,如果时间很短,先到poll阶段,时间到了循环到timers之前,check阶段就把setImmediate()执行了
    setTimeout(()=>{},0)===setTimeout(()=>{},4),因为setTimeout最小的时间间隔是4ms

process.nextTick()

从技术上来讲 process.nextTick() 并不是 event loop 的一部分,不管 event loop 当前处于哪个阶段,nextTick 队列都是在当前阶段后就被执行了,在任何一个阶段调用 process.nextTick(回调),回调都会在当前阶段继续运行前被调用。

Proudly published with Hexo