Node.js 中的事件循环机制

概念

  • “事件循环机制” 是浏览器或 Node.js 对于主线程的调度方式,主线程寻找任务并执行的过程就是事件循环。

Node.js 的事件循环

  • 事件循环的多个阶段:

    • timer
    • pending callbacks —— 对某些系统操作执行回调
    • (idle) —— Node 内部使用
    • (prepare) —— Node 内部使用
    • poll (I/O)
    • check
    • close callbacks
  • 4 个宏任务队列:

    • Timers Queue
    • I/O Queue
    • Check Queue
    • Close Callback Queue
  • 2 个微任务队列:(顺序如下)

    • Next Tick Queue:process.nextTick(callback)
    • Other micro task:Promise 等
  • 事件循环机制:

    • v10-:每个宏任务队列结束后,去清空微任务队列。
    • v11+:每个宏任务完成后,就去清空微任务队列。

微任务与宏任务

  • 微任务常见情况有:process.nextTick() (Node 独有)、Promise、MutationObserver。
  • 宏任务常见情况有:setTimeout()setInterval()setImmediate() (Node 独有)、requestAnimationFrame() (浏览器独有)、I/O、UI 渲染 (浏览器独有) 等。

setImmediate()setTimeout()

  • 两者分别属于不同阶段:“check 阶段” 和 “timer 阶段”。

  • setTimeout() 的延时至少要有 1ms。进入事件循环后,如果超过 1ms,则会先执行 setTimeout();如果未超过 1ms,则会跳过 timer 阶段,进入 check 阶段,先执行 setImmediate()

相关小抄