I/O:读写操作、输入输出、请求响应
Check
阶段被执行poll
队列为空,代码被 setImmediate()
,无论是否有 timers
达到下限时间,setImmediate()
的代码都先执行。Timer
阶段被执行Timer
队列中在 Node
中执行下面的代码,会出现两种输出结果
1 | setTimeout(() => { |
一次循环首先进入的是 timers
阶段,进入这个阶段后,主线程会检查一下当前时间,是否满足定时器的条件。如果满足就执行回调函数,否则就离开这个阶段。所以如果进入之前一毫秒已经过去了,那么 setTimeout
的回调会首先执行。setTimeout
最小值是 >= 1ms/4ms
,0
会被转成 >= 1ms/4ms
根据具体情况确定
而下面这样就只会出现唯一的结果
1 | //index.js |
因为 fs.readFile
的回调是在 poll
阶段执行的,当其回调执行完毕之后,poll
队列为空,而 setTimeout
入了 timers
队列,此时有代码被 setImmediate()
,于是时间循环进入 check
阶段执行回调,之后再下一个时间循环再进入 timers
阶段。
整个顺序是:
timer
,没有 I/O 回调
I/O Callbacks
poll
阶段,等待文件读取I/O 回调
,进入 I/O Callbacks
阶段执行 fs.readFile 的回调check
阶段,发现有 setImmediate
回调,执行timers
阶段,这时才执行 setTimeout
的回调nextTickQueue
1 | var fs = require('fs'); |
process.nextTick
类似,在本轮循环就安排了同步任务
结束后 nextTickQueue
结束后 microTaskQueue
其他:
Node
环境下setTimeout
和 Promise.resolve().then
EventLoop