为什么在使用 Express 应用程序时 setTimeout 仍然有效?

Why does setTimeout still work when using an Express app?

我正在制作一个 Express 应用程序,我打算在一段时间后使用 setTimeout 使与第三方 API 一起使用的访问令牌失效。我认为它可能行不通,因为像 setTimeout 这样的异步函数被推送到事件队列中,并且在其他所有事情完成之前 运行 不会 运行ning。 Express 应用程序(我假设)总是 ​​运行ning 因为它一直在监听请求所以我认为由于程序永远不会完成,setTimeout 永远不会 运行。但是 setTimeout 运行 很好而且准时。

怎么还有可能? Express的监听部分是不是有非JS的东西,还是我误解了async和事件队列?

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

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

事件通常以 FIFO(先进先出)的方式提供,尽管当队列中有多种不同类型的事件等待 运行.

The Express app (I'm assuming) is always running because it's always listening for requests so I thought that since the program never finishes, the setTimeout would never run. But the setTimeout ran just fine and on time.

“始终运行ning”,在这种情况下,仅表示它已准备好并等待传入​​请求。只要 JS 解释器 returns 返回到下一个事件的事件循环,事件队列中的其他东西(比如计时器)就能够 运行 就好了。