node端
正确理解 Node.js 的 Event loop (知乎专栏)
Node 定时器详解 (阮一峰博客)
不要混淆nodejs和浏览器中的event loop(cnode)
如何从libuv看Nodejs中的事件循环核心机制?(极客时间)

时间循环模型

image.png

image.png

1 一次循环包含六个阶段

主要的三个阶段

1.1 timers: 定时器执行阶段

1.2 poll : I/0 callback执行阶段

大部分异步api回调在这个阶段执行

1.3 check: setImmediate 执行阶段

setImmediate()内部调用setImmediate,在下一次循环执行

次要的三个阶段

1.4 pending callback(又叫I/o callback)

根据libuv的文档,一些应该在上轮循环poll阶段执行的callback,因为某些原因不能执行,就会被延迟到这一轮的循环的I/O callbacks阶段执行。换句话说这个阶段执行的callbacks是上轮残留的。

1.5 idle,prepar

仅内部使用

1.6 close callbacks

执行close事件的callback,例如socket.on("close",func)

2 process.nextTick

不属于上面的任何一个阶段(phase),它在每个阶段结束的时候都会运行
当事件循环准备进入下一个阶段之前,会先检查nextTick queue中是否有任务,如果有,那么会先清空这个队列,有点类似promise,递归调用,会造成阻塞。
而且nextTick queue优先级高于microtask queue
也可以把把两者都当做microtask,只是process.nextTick 优先级高于 promise

3 执行顺序

事实上,每个阶段都包含三个队列(这里把process.nextTick包含到以上提到的阶段里面了,便于理解)
其中process.nextTick优先级高于promise
image.png

4 不确定定性

  1. setTimeout(function() {console.log("setTimeout")}, 0)
  2. setImmediate(() => {
  3. console.log('setImmediate');
  4. });

以上代码 那个先执行?
答案: 随机,都有可能。
因为: image.png