node端
正确理解 Node.js 的 Event loop (知乎专栏)
Node 定时器详解 (阮一峰博客)
不要混淆nodejs和浏览器中的event loop(cnode)
如何从libuv看Nodejs中的事件循环核心机制?(极客时间)
时间循环模型
1 一次循环包含六个阶段
1.1 timers: 定时器执行阶段
1.2 poll : I/0 callback执行阶段
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
4 不确定定性
setTimeout(function() {console.log("setTimeout")}, 0)
setImmediate(() => {
console.log('setImmediate');
});
以上代码 那个先执行?
答案: 随机,都有可能。
因为: