I/O 回调中安排的 setImmediate() 函数是否可以重新计算其他 I/O 通知的超时?

Can a setImmediate() function scheduled in an I/O callback recalculate timeout for other I/O notifications?

Node js 事件循环的 poll 阶段。它的目的是阻塞地等待 I/O 通知,然后执行所需的回调。进入该阶段前计算等待超时时间。如果有通过 setImmediate 安排的操作,则超时设置为 0,如果发生计时器,则超时设置为考虑到它们,如果没有此类障碍,则阻塞将“永远”继续。

如果超时最初设置为“无穷大”并且 I/O 回调计划使用 setImmediatesetInterval 的函数,会发生什么情况?是立即重新计算超时还是仅在 I/O 队列变空后(在下一个循环迭代中)重新计算?

因此,如果我们等待两个启动的带有回调 AB 的异步操作,并在收到 I/O 通知后执行 A 并依次安排一些C 函数与 setImmediate 函数首先执行什么 BC?

请注意,对于一些更常见的异步 API 定时器支持(例如 select()kqueue() 系统调用)定时器值为零(0) 表示 infinity 的值,因此您不能通过计算下一个超时值并调用异步 API。相反,所有 setImmediate()nextTick() 回调 必须 在调用异步 API.

之前被同步调用

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

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

但如果 AB 同时发生,函数调用的顺序将是:ABC.

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

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


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