Caz*_*tor 5 javascript node.js
我有一个 Express 应用程序,在解析特定路由的请求时使用事件发射器。当收到请求时,将调用emit,它会在处理程序中运行代码。此代码大约需要 5 秒才能完成。当 Express 端点每秒收到 10 个或更多请求时会发生什么?
事件是否会被放入调用堆栈并按照放入调用堆栈的顺序完成?
谢谢
status.emit('newCompletion')
Run Code Online (Sandbox Code Playgroud)
EventEmitter 事件是同步的。当你执行他们的时候,他们就会执行.emit()。您几乎可以将它们视为函数调用,其中调用.emit()只是立即调用任何匹配侦听器的函数。
事件是否会被放入调用堆栈并按照放入调用堆栈的顺序完成?
它们是同步执行的。您在这里使用的措辞让我认为您认为 eventEmitter 事件有某种队列。那没有。您调用.emit()该事件名称的任何侦听器都会立即调用(.emit()甚至在返回之前)。
我有一个 Express 应用程序,在解析特定路由的请求时使用事件发射器。当收到请求时,将调用emit,它会在处理程序中运行代码。此代码大约需要 5 秒才能完成。当 Express 端点每秒收到 10 个或更多请求时会发生什么?
如果要完成的 5 秒是同步代码,那么在这 5 秒内不会发生任何其他事情。不会处理其他传入请求(它们可能位于操作系统中的某些传入 TCP 队列或事件队列中)。因此,我们将运行 5 秒的代码,将控制权返回给 NodeJS(通过完成其执行),然后 NodeJS 将从事件队列中获取下一个事件并处理下一个请求。
如果完成的 5 秒包含一些异步操作,因此它是 5 秒的时钟时间,而不是 5 秒的 CPU 时间,那么事情会更加复杂。一旦第一个请求通过注册的回调触发异步操作,然后将控制权返回给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");Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/EventEmitter/5.2.2/EventEmitter.js"></script>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |