gpt4 book ai didi

javascript - Node : How to handle event listening between objects?

转载 作者:搜寻专家 更新时间:2023-10-31 22:30:18 24 4
gpt4 key购买 nike

我目前遇到的问题是我有一个对象应该监听另一个对象。

问题是:我应该如何处理订阅?目前,我只知道两种可能的方式:

注册器:

var Registrator = function() {
this.listener = new Listener();
};

Registrator.prototype.register = function(subsriber) {
var self = this;
subscriber.on('event', function(info) {
self.listener.doSomething(info);
});

};

在构造函数中:

var Subscriber = function() {
var listener = require('./instanced-listener');
this.on('event', function(info) {
listener.doSomething(info);
});

};

如您所见,这两种方法都不是那么简洁。我可以使用另一种模式来解决这个问题吗?

附言:

如果这个例子看起来太抽象,这里是来源:

https://github.com/bodokaiser/documents/blob/master/lib/repository.js

检查构造函数看看我的不开心:)

最佳答案

这实际上取决于对象将如何广播和收听以及您要求它们耦合或解耦的程度。一般来说,这种类型的事件架构的最佳用途是一个对象可以不加区别地向其他对象宣布事件,而这些对象可以自行决定选择监听(注册)或停止监听(注销)。

1。监听器依赖于广播器

在某些情况下,使监听器成为广播者的依赖项可能是有意义的,在这种情况下,它将与事件名称和该广播者宣布的事件的参数紧密耦合。

var Listener = function(broadcaster) {
var self = this;
broadcaster.on("event", function(info) {
self.doSomething(info);
});
};

也可以创建其他监听器类并将它们自己注册到同一个广播者。广播者不知道听众,只有听众知道这种关系。

2。广播者依赖于听众

广播者仅为听众宣布事件。在这种情况下,事件体系结构可能有点矫枉过正,您可以将事件替换为直接调用。你的第二个例子暗示了这一点,因为在广播者的构造函数中与听众的一对一关系。

var Broadcaster = function(listener) {
this.doSomething = function() {
// do something...
listener.doSomething(info);
};
};

这在广播者和听众界面之间建立了强耦合。这种模式并不像它最初看起来那样具有限制性。扩展此模式有用性的一种常见方法是用广播适配器替换基本监听器。广播适配器看起来与基本监听器相同,因为它带有相同的 doSomething 接口(interface),但实现了一个事件架构以将此调用传递给其他对象。这使得广播器非常简单,并且以额外的类为代价将与事件有关的任何事情外部化。

3。两者都是独立的

你的第一个例子是释放这种耦合的一个很好的例子,成本是一个额外的类。中间类充当两个类之间的桥梁或适配器,因此两者都不依赖于彼此的信息。事件签名对监听器是隐藏的,监听器的方法签名对广播者是隐藏的。这种级别的解耦通常是不必要的,但却是一个重要的工具,可以让您了解在哪些方面保持两个类彼此隔离很重要。

var Bridge = function(listener, broadcaster) {
broadcaster.on("event", function(info) {
// if necessary translate the arguments as well
listener.doSomething(info);
});
};

关于javascript - Node : How to handle event listening between objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14020697/

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