为什么setTimeout仍然工作时使用Express应用程序?



我正在制作一个Express应用程序,我打算使用setTimeout在一段时间后使第三方API使用的访问令牌无效。我认为它可能不起作用,因为像setTimeout这样的异步函数被推到事件队列上,直到其他一切都完成运行才运行。Express应用程序(我假设)总是在运行,因为它总是在监听请求,所以我认为,既然程序永远不会完成,setTimeout将永远不会运行。但是setTimeout运行得很好,而且很准时。

这怎么还可能?在Express的监听部分是否有非js的东西,或者我误解了异步和事件队列?

Express服务的所有请求都像setTimeout()一样经过事件队列,因此它们共享相同的事件队列,并且可以很好地交错。

因此,当传入请求到达Express服务器时,一些较低级别的TCP代码将传入连接插入到事件队列中。下一次Express完成执行某事时,nodejs解释器返回事件队列并获取下一个事件。它可以是下一个传入请求,也可以是服务请求的一些中间异步操作(例如数据库查询完成),也可以是您的setTimeout()

事件通常采用FIFO(先进先出),尽管当队列中有多个不同类型的事件等待运行时,不同类型的事件之间存在一些优先级,这些优先级会影响排序细节。

Express应用程序(我假设)总是在运行,因为它总是在监听请求,所以我认为,既然程序永远不会完成,setTimeout永远不会运行。但是setTimeout运行得很好,而且很准时。

在这种情况下,"Always running"仅仅意味着它已经准备好并等待传入的请求。事件队列中的其他东西(如计时器)能够在JS解释器返回到下一个事件的事件循环时正常运行。

最新更新