一直以为事件循环是一个独立于NodeJS主线程的单独工作线程,其实并非如此;
事件循环是在NodeJS主线程中完成的;
NodeJS提供四种定时器
为了协调异步任务,使任务按时间顺序执行,NodeJS提供了四种定时器;
- setTimeout()
- setInterval()
- setImmediate()
- process.nextTick()
其中setTimeout
、setInterval
存在于JS语言标准,
而setImmediate
、process.nextTick
则为NodeJS独有;
任务的执行顺序
同步
任务先于异步
任务执行本轮
循环先于次轮
循环执行
本轮事件循环
本轮循环中存在两个队列:
- nextTick队列(nextTickQueue)
- 微任务队列(microTaskQueue)
在本轮循环中process.nextTick
是优先执行的,所有的nextTick
定时器执行完成后,
才轮到微任务队列定时器执行,常见的Promise
就属于微任务定时器;
次轮事件循环
事件循环的六个阶段:
timers阶段
: 处理setTimeout、setInterval的回调函数i/o callback阶段
: 处理除setTimeout、setInterval、setImmediate、close callback以外的回调函数idle、prepare阶段
: 供LibUV内部使用poll阶段
: 等待未返回的IO事件,直到返回结果check阶段
: 处理setImmediate的回调函数close callback阶段
: 处理关闭事件的回调,如socket.on(‘close’)
- 参考:定时器详解