Node.js javascript类上的事件或函数

Node.js javascript类上的事件或函数,node.js,Node.js,我在一些类中使用了EventEmitter,但我真的很困惑事件侦听和事件发送是否比调用对象方法更有效 我希望该对象能够侦听向其发出的大量事件,并向最初向该对象和其他一些对象发出事件的对象发出大量事件 我非常困惑是否应该在什么时候使用函数,这些函数反过来调用其他对象方法等等 事件改善了模块解耦。这是一个简单的问题:“修改或添加功能X需要触摸多少文件?” 一个简单的例子:您有一个web服务器、一个日志模块和一个启动脚本,它们在启动时将两者联系在一起。函数调用方式如下所示: // Startup.js

我在一些类中使用了
EventEmitter
,但我真的很困惑事件侦听和事件发送是否比调用对象方法更有效

我希望该对象能够侦听向其发出的大量事件,并向最初向该对象和其他一些对象发出事件的对象发出大量事件


我非常困惑是否应该在什么时候使用函数,这些函数反过来调用其他对象方法等等

事件改善了模块解耦。这是一个简单的问题:“修改或添加功能X需要触摸多少文件?”

一个简单的例子:您有一个web服务器、一个日志模块和一个启动脚本,它们在启动时将两者联系在一起。函数调用方式如下所示:

// Startup.js
var Startup = function() {
    var logger = new Logger();
    var server = new Server(logger);
};

// Logger.js
var Logger = function() {
};
Logger.prototype.log = function(msg) {
    console.log(msg);
};

// Server.js
var Server = function(logger) {
    this.logger = logger;
};
Server.prototype.start() {
    this.logger.log("Start server...");
};
您可以看到,Startup了解所有类,服务器了解logger以及如何使用它。如果我想将记录器的功能日志重命名为write,我必须触摸记录器和服务器

现在让我们看一看事件驱动的方法:

// Startup.js
var Startup = function() {
    var logger = new Logger();
    var server = new Server();
    server.addListener(logger);
};

// Logger.js
var Logger = function() {
    this.on("startup", function(msg) {
        console.log(msg);
    });
};
Logger.prototype.__proto__ = EventEmitter.prototype;

// Server.js
var Server = function() {
};
Server.prototype.start() {
    this.emit("startup", "Start server...");
};
Server.prototype.__proto__ = EventEmitter.prototype;
现在,记录器和服务器彼此不认识。我可以重新命名日志,我只需要触摸Logger.js。我甚至可以删除记录器或添加更多记录器,所有这些记录器都使用服务器。但我从来不用接触Server.js

这是一个简单的例子,解耦在这里看起来并不重要。但项目规模越大,效益就越大

您可以对服务器进行单元测试,而无需模拟记录器。而Logger只是一个依赖项。想象一下,如果服务器有五个或更多的子模块需要模拟,那么它的优势是什么


我希望这能帮助您理解事件驱动体系结构的好处。

当一个简单的函数调用可以在所有情况下工作时,不要使用事件。对于函数调用,调用方必须知道调用的对象。有时,如果发射器不知道(或不知道)哪些对象正在监听,那么就使用事件。@LeeMeador是有意义的。