最近在学习node
在Node源码的deps/uv/src/timer.c中141行,有一个 uv__next_timeout 的函数;
这个函数决定了,poll阶段要不要阻塞在这里;
阻塞在这里的目的是当有异步IO被处理时,尽可能快的让代码被执行;
如果事件循环开启的时间(ms)是小于 setTimeout函数的执行时间的;
也就意味着先开启了event-loop,但是这个时候执行到timer阶段,
并没有 定时器的回调被放到入 timer queue中;
所以没有被执行,后续开启定时器和检测到有setImmediate时,就会跳过 poll阶段,向后继续执行;
这个时候是先检测 setImmediate,第二次的tick中执行了timer中的 setTimeout;
如果事件循环开启的时间(ms)是大于 setTimeout函数的执行时间的;
p这就意味着在第一次 tick中,已经准备好了timer queue;
所以会直接按照顺序执行即可;