在I/O回调中调度的setimmedate()函数可以重新计算其他I/O通知的超时吗?



有Node js事件循环的poll阶段。它的目的是阻塞地等待I/O通知,然后执行所需的回调。在进入此阶段之前,将计算等待的超时时间。如果有通过setImmediate调度的操作,则超时设置为0;如果发生了计时器,则超时设置为显示它们的视图;如果没有此类障碍,则阻塞将"永远"继续。

如果初始超时设置为&;infinity&;将会发生什么?I/O回调调度setImmediatesetInterval函数?是立即重新计算超时,还是在I/O队列变为空之后(在下一个循环迭代中)才重新计算超时?

因此,如果我们等待两个启动的异步操作,回调AB,在收到I/O通知后,A被执行,它反过来与setImmediate调度一些C函数,该函数将首先执行BC吗?

请注意,对于一些更常见的带有计时器支持的异步API(例如:当select()kqueue()系统调用时,定时器值为0 (0)表示无穷大因此,您无法通过计算下一个超时值并调用异步API来实现setImmediate()nextTick()之类的函数。相反,所有setImmediate()nextTick()回调必须在调用异步API之前被同步调用。

因此,由于CsetImmediate()的回调,它将在我们重新进入事件循环等待B触发之前被调用。

如果A只有a被触发,那么函数调用的顺序将是:AC

但是如果AB同时发生,函数调用的顺序将是:A,B,C

请注意,我说的是AC,而不是A,C,B,因为我们没有说B被触发。据我所知,B只会在8个月后被触发,甚至永远不会。

但是如果A被触发,1毫秒后B发生,那么函数调用的顺序将是:A,C,B


是否有可能在同一个事件循环中发生两个事件?通常是的。如果是网络I/O,这是不太可能的,因为IP数据包是序列化的,但它仍然可能发生,特别是如果您的机器有多个网卡。如果是像DOM更新这样的图形事件,那么在同一个事件循环中发生两件事是很常见的,例如:页面大小调整和内容回流可以同时发生,特别是使用媒体查询的响应式CSS,其中页面大小调整可以触发内容回流。

相关内容

  • 没有找到相关文章

最新更新