node事件循环学习笔记

  • html

    setTimeout(() => console.log(1));
    setImmediate(() => console.log(2));
    process.nextTick(() => console.log(3));
    Promise.resolve().then(() => console.log(4));
    (() => console.log(5))();
    复制代码

    执行结果:node

    5
    3
    4
    1
    2
    复制代码

node事件分 同步、异步,因为JS的单线程原理,异步事件的处理方式依靠 事件循环。canvas

  • 异步事件分为:微事件/宏事件
  • 微事件包括:
    • process.nextTick
    • Promise.then
  • 宏事件包括:
    • setTimeout/setInterval
    • setImmediate
    • I/O callback

不一样的异步事件,循环规则也不一样。bash


宏事件循环

  1. timers阶段:setTimeout/setInterval的回调函数执行阶段
  2. I/O callbacks阶段:未解决的回调执行执行
  3. poll阶段:轮询阶段。接受新的I/O回调,并将其加入轮询列队中进行先进先出的顺序执行。
    • 若该阶段事件列队为空,检查check阶段是否有事件列队,有则顺序执行。同时也会检查是否有定时器到达阈值,若是有则循环绕到timers阶段时执行。若是没有其余异步任务要处理会一直停留在该阶段等待 I/O 结果返回。
    • 若该阶段的事件列队不为空,则将事件列队中的事件执行完直到为空,或直到内存溢出
  4. check阶段:执行setImmediate()的回调函数
  5. close callbacks:执行关闭请求的回调函数 .on('close', callback)

微事件循环

  1. process.nextTick
  2. Promise.then

在同一次循环中process.nextTick总要比Promise.then先执行异步

循环原则

  • 只有前一个阶段的事件队列所有清空之后,才会执行下一个阶段的事件队列
  • 进入到下一个阶段的事件列队以前,会先执行微事件列队直到为空。
  • 同一次循环中,微事件的执行老是优先于宏事件

事件执行顺序:

  1. 同步事件
  2. 发出异步请求
  3. 规划定时器生效的时间
  4. process.nextTick
  5. Promise.then
  6. 事件循环

图解

笔者自画,理解不当之处,敬请纠正,感激涕零 函数

image

终极挑战

setTimeout(() => {
  process.nextTick(() => {
    console.log(1)
    process.nextTick(() => console.log(2))
  });
  console.log(3)
  setTimeout(() => { console.log(4)})
  setImmediate(() => console.log(5));
});
setTimeout(() => {
  process.nextTick(() => console.log(6));
  Promise.resolve(7).then(res=>console.log(res))
  console.log(8)
});
(() => console.log(9))();
setImmediate(() => console.log(10));
复制代码

你答对了吗?oop

9
3
8
1
6
2
7
10
5
4
复制代码

参考连接

Node 定时器详解——阮一峰ui

Node.js event loop workflow & lifecycle in low levelspa

相关文章
相关标签/搜索