有Node js事件循环的poll
阶段。它的目的是阻塞地等待I/O通知,然后执行所需的回调。在进入此阶段之前,将计算等待的超时时间。如果有通过setImmediate
调度的操作,则超时设置为0;如果发生了计时器,则超时设置为显示它们的视图;如果没有此类障碍,则阻塞将"永远"继续。
如果初始超时设置为&;infinity&;将会发生什么?I/O回调调度setImmediate
或setInterval
函数?是立即重新计算超时,还是在I/O队列变为空之后(在下一个循环迭代中)才重新计算超时?
因此,如果我们等待两个启动的异步操作,回调A
和B
,在收到I/O通知后,A
被执行,它反过来与setImmediate
调度一些C
函数,该函数将首先执行B
或C
吗?
请注意,对于一些更常见的带有计时器支持的异步API(例如:当select()
或kqueue()
系统调用时,定时器值为0 (0
)表示无穷大因此,您无法通过计算下一个超时值并调用异步API来实现setImmediate()
或nextTick()
之类的函数。相反,所有setImmediate()
或nextTick()
回调必须在调用异步API之前被同步调用。
因此,由于C
是setImmediate()
的回调,它将在我们重新进入事件循环等待B
触发之前被调用。
如果A
和只有a被触发,那么函数调用的顺序将是:A
和C
。
但是如果A
和B
同时发生,函数调用的顺序将是:A
,B
,C
。
请注意,我说的是A
和C
,而不是A
,C
,B
,因为我们没有说B
被触发。据我所知,B
只会在8个月后被触发,甚至永远不会。
但是如果A
被触发,1毫秒后B
发生,那么函数调用的顺序将是:A
,C
,B
是否有可能在同一个事件循环中发生两个事件?通常是的。如果是网络I/O,这是不太可能的,因为IP数据包是序列化的,但它仍然可能发生,特别是如果您的机器有多个网卡。如果是像DOM更新这样的图形事件,那么在同一个事件循环中发生两件事是很常见的,例如:页面大小调整和内容回流可以同时发生,特别是使用媒体查询的响应式CSS,其中页面大小调整可以触发内容回流。