Node.js事件会发生什么?

我有一个Express应用程序,当parsing请求到一个特定的路线时使用事件发射器。 当接收到一个请求时,会调用emit,它在处理程序中运行代码。 此代码需要大约5秒钟才能完成。 当Express端点每秒收到10个或更多请求时,会发生什么情况?

这些事件是否会被放入调用堆栈并按照它们被放入调用堆栈的顺序完成?

谢谢

status.emit('newCompletion') 

EventEmitter事件是同步的。 当你.emit()它们时,它们会执行。 你几乎可以把它们想象成函数调用,其中调用.emit()只是立即调用任何匹配的监听器的函数。

这些事件是否会被放入调用堆栈并按照它们被放入调用堆栈的顺序完成?

它们被同步执行。 你在这里使用的措辞让我觉得你认为有eventEmitter事件的某种排队。 那没有。 你调用.emit()并立即调用该事件名称的任何侦听器(在.emit()之前甚至返回)。

我有一个Express应用程序,当parsing请求到一个特定的路线时使用事件发射器。 当接收到一个请求时,会调用emit,它在处理程序中运行代码。 此代码需要大约5秒钟才能完成。 当Express端点每秒收到10个或更多请求时,会发生什么情况?

如果5秒完成是同步代码,那么在这5秒内没有其他事情发生。 没有其他传入的请求将被处理(它们将可能位于操作系统或事件队列中的某个传入TCP队列中)。 所以,运行5秒的代码,将控制权返回给nodejs(通过完成执行),然后nodejs将从事件队列中获得下一个事件,并处理下一个请求。

如果5秒完成包含一些asynchronous操作,所以它是5秒的时钟时间,但不是5秒钟的CPU时间,然后事情更复杂。 只要第一个请求使用已注册的callback触发asynchronous操作,然后将控制权返回给node.js,它就会从事件队列中抓取下一个事件,并开始运行该请求处理程序。 这将运行,直到它将控制权还给系统。 任何这些请求中的任何.emit()调用都将是同步的,并且除了执行函数调用来执行该事件的处理程序外,不会产生任何其他内容。

你可以看到.emit()在这里是同步的,它在其他任务和微任务之前:

 let em = new EventEmitter(); em.on("hello", function() { console.log("hello"); }); // schedule "immediate" task setTimeout(function() { console.log("timer"); }, 0) // schedule "immediate" micro-task Promise.resolve().then(function() { console.log("promise"); }); em.emit("hello"); console.log("ready"); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/EventEmitter/5.2.2/EventEmitter.js"></script>