gpt4 book ai didi

node.js - javascript 类上的事件或函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:37 26 4
gpt4 key购买 nike

我在某些类中使用 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 知道所有类,而 Server 知道记录器以及如何使用它。如果我想将 Logger 的功能日志重命名为 write,我必须触摸 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.js。我什至可以删除记录器或添加更多记录器,所有这些记录器都与服务器一起使用。但我从来不需要接触 Server.js。

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

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

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

关于node.js - javascript 类上的事件或函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com