Event Loop

event loop 是一种执行机制,应对不同场景的执行方案模型。不同的js执行环境尤其不同的事件轮询。

浏览器宏队列和微队列

  1. 宏队列,macrotask,也叫tasks。
    • setTimeout
    • setInterval
    • setImmediate (Node独有)
    • requestAnimationFrame (浏览器独有)
    • I/O
    • UI rendering (浏览器独有)
  2. 微队列,microtask,也叫jobs。
    • process.nextTick (Node独有)
    • Promise
    • Object.observe
    • MutationObserver
  3. 执行顺序: 先执行同步、在执行微队列、微队列没有之后执行宏队列,执行中可以一直往微队列中放任务到末尾,会有上限。

Node 事件循环

  1. 会分为6个阶段,每个阶段执行完毕,会去执行微队列中的任务,6个阶段如下:
    • timers:执行setTimeout() 和 setInterval()中到期的callback。
    • I/O callbacks:上一轮循环中有少数的I/Ocallback会被延迟到这一轮的这一阶段执行
    • idle, prepare:队列的移动,仅内部使用
    • poll:
      (1) 计算需要为新的I/O事件等待多久
      如果队列为空且不存在setImmediate与就绪的timer,Node.js会在这里block一定的时间等待新的I/O事件到来,立即执行其回调。这种情况具体block等待多久是不具体的,但如果在block一定时间后仍没有新到达的I/O事件,可以肯定循环依旧会进入check阶段或者回到timer阶段。
      (2) 处理该阶段队列中的事件
      当进入poll阶段,如果队列不为空且没有就绪的timer,Node.js会在这里执行队列中的callback直到队列为空或者执行的callback数达到系统设定的某个值。随后Node.js检查是否存在预设的setImmediate,存在话就进入check阶段,否则开始检查timer就绪情况选择回到timer阶段或者进入check阶段
    • check:执行setImmediate的callback
    • close callbacks:执行close事件的callback,例如socket.on(“close”,func)