为啥 Node.js 不连续监听事件?

Posted

技术标签:

【中文标题】为啥 Node.js 不连续监听事件?【英文标题】:Why doesn't Node.js listen for the event continuously?为什么 Node.js 不连续监听事件? 【发布时间】:2019-06-03 00:34:32 【问题描述】:

我假设 Node.js 持续监听事件并在触发事件时异步处理监听代码。

我尝试使用“事件”模块定义自定义事件,该模块在脚本中手动发出。

var events = require('events');
var myEmitter = new events.EventEmitter();

myEmitter.on('someEvent', function(msg)
console.log(msg);
);

myEmitter.emit('someEvent', 'the event is emitted');

当我运行上述脚本时,进程仅在处理一次事件后终止。 Node.js 怎么知道以后不会有更多可以触发的事件?我已经看到“http”模块的 server.listen() 连续侦听传入连接,并且在获得第一个连接后不会终止。为什么我的代码的行为方式不同?

或者换句话说,我如何定义异步和连续监听的事件?

编辑:我还想知道意外发生的事件(例如,浏览器按钮单击、服务器获得连接等)如何在后台工作,以使程序连续运行而不会终止。

【问题讨论】:

在你的代码中,你只触发了一次事件? 没有任何异步会触发脚本中的事件。 顺便说一句,EventEmitter 是同步的,它只是一个用于管理订阅并用纯 JS 编写的小包装器。没有什么特别之处可以让进程保持运行 - 是 server.listen() 执行此操作。 【参考方案1】:

我们在这里谈论两个不同的事情。事件和套接字。

在您的情况下,您对节点说,当名为 someEvent 的事件出现时,您想要处理它。然后你发出这个事件。当你这样做时,node.js 会看到它有一个自定义处理程序并调用你的函数。当你的函数结束时,程序中没有更多的事情要做,它就会终止。

Node.js 不会主动等待如下事件:

while (1) 
  if (isThereANewEvent()) treatTheNewEvent();

这是一种被动的等待。


另一方面,套接字是 I/O,当您启动服务器时,它有一个主动等待。这就是为什么你的程序在调用.listen后不会终止的原因

【讨论】:

谢谢。您是说只有导致“主动等待”的任务被异步处理?如果是这样,我怎么知道哪些事件导致了“主动等待”? @Curious:正确,只有异步任务是异步处理的。建立在上面帮助处理异步任务的一切都只是设计模式,其中包括事件、承诺等。真正的异步必须由操作系统提供,最终取决于硬件特性(主要是中断) @Curious - 请参阅我对此问题的回答,以快速了解异步在低级别如何工作:***.com/questions/29883525/…

以上是关于为啥 Node.js 不连续监听事件?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js自定义对象事件监听与发射

简单剖析Node中的事件监听机制

在 Node.js 中监听所有发出的事件

Node.js进击基础一(5-11事件模块)

Socket.io - 在 node.js 的单独文件中监听事件

如何从 node.js 应用程序永久监听智能合约中的事件?