1 回答
TA贡献2011条经验 获得超2个赞
node.js 中的任何事件驱动项最终都有一些代码在将来的某个时间在事件队列中插入回调。这可以是内置项目,如setTimeout()
,,,通过模块setInterval()
联网,通过net
模块异步文件 I/Ofs
等......或者也可以是使用附加 API 的原生代码附加组件,触发事件和导致回调被插入到事件队列中。这是未来某个时间发生的任何异步事件如何在 node.js 中工作的关键。每个异步操作都使用相同的机制。
事件循环实际上相当复杂,包含一堆不同类型的队列。一个用于 I/O,一个用于定时器,一个用于 Promise。它们有不同的优先级和一定的顺序。例如,Promise 比其他类型的事件具有更高的优先级。定时器实际上与其他定时器的工作方式略有不同,但您仍然可以在逻辑上将它们视为一组定时器,当它们被触发时,它们会导致回调被调用。
除了定时器,当一个事件想要被触发时,一些本地代码会在某个地方插入一个回调到事件队列的适当部分。当事件循环处理该特定类型的事件时,它将调用与该事件关联的回调并执行与该回调关联的 Javascript。当该回调返回时,它会继续围绕事件循环寻找其他事件来运行回调。如果没有找到任何准备就绪的东西,它就会休眠,直到有东西被插入到事件队列中或直到下一个计时器准备好触发。
计时器使用排序链表,下一个计时器位于列表的前面。事件循环只是将当前系统时间与列表前面的计时器的触发时间进行比较。如果当事件循环开始检查计时器时该事件触发的时间(或超过计时器),则执行与该计时器关联的回调并将其从链接列表中删除。如果不是,则事件循环继续处理其他类型的事件。
添加回答
举报