【问题标题】:Events or functions on javascript classjavascript 类上的事件或函数
【发布时间】:2013-04-10 15:37:33
【问题描述】:

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

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

我很困惑是否应该使用函数,而这些函数又调用其他对象方法等等。

【问题讨论】:

  • 当一个简单的函数调用可以在所有情况下工作时,不要使用事件。对于函数调用,调用者必须知道正在调用什么对象。如果有时发射器不知道(或不知道)哪些对象正在侦听,则使用事件就是这种情况。
  • @LeeMeador 说得通。

标签: node.js


【解决方案1】:

事件改进了模块解耦。都是关于这个简单的问题:“我需要修改多少文件才能修改或添加功能 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 知道所有类,Server 知道 logger 以及如何使用它。如果我想重命名 Logger 的函数 log 来写,我必须触摸 Logger 和 Server。

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

// 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 和 Server 互不认识。我可以重命名日志,我只需要接触 Logger.js。我什至可以删除 Logger 或添加更多 Logger,它们都与 Server 一起工作。但我从来不用碰 Server.js。

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

您可以对服务器进行单元测试,而无需模拟 Logger。而 Logger 只是一个依赖项。想象一下,如果 Server 有五个或更多您必须模拟的子模块,会有什么好处。

我希望这可以帮助您了解事件驱动架构的好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2018-07-18
    • 1970-01-01
    相关资源
    最近更新 更多