目前,我有,我有一个对象,应在另一个对象听的问题。
现在的问题是:我应该如何处理订阅? 目前,我只知道两种可能的途径:
随着registrator:
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);
});
};
正如你所看到的,这两种方法是不是很方便。 有哪些我可以用这个问题的另一种模式?
问候
PS:
如果例子看起来过于抽象,这里是源:
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
接口,但实现了一种事件架构转嫁到其他物体这一呼吁。 这使广播非常简单,将其外部什么做额外类的费用的事件。
3.两者都是独立
你的第一个例子是释放这种耦合的成本是额外类的一个很好的例子。 中间类充当两个类之间的桥或适配器,使得既不依赖于彼此的信息。 本次活动的签名从听者隐藏和监听方法签名是从广播隐藏。 通常这种级别脱钩的是不必要的,但要注意的保持相互隔离的两个班,其中很重要的一个重要工具。
var Bridge = function(listener, broadcaster) {
broadcaster.on("event", function(info) {
// if necessary translate the arguments as well
listener.doSomething(info);
});
};
编辑
根据您的意见,我不知道你发现无法读取有关这一点,但你可以尝试使用Stream
对象和优雅的Stream#pipe
法。
流
var Stream = require('stream').Stream;
var util = require('util');
var Sender = function() {
this.readable = true;
this.saySomething = function(message) {
this.emit('data', message);
};
};
util.inherits(Sender, Stream);
var Receiver = function() {
this.writable = true;
this.write = function(message) {
console.log('received: ' + message);
}
};
util.inherits(Receiver, Stream);
用法
// instance of each
var s = new Sender();
var r = new Receiver();
// connect using pipe!
s.pipe(r);
// an event
s.saySomething('hello world'); //=> received: hello world
我特别喜欢使用Stream
对象。 该pipe
的方法是非常方便:)每个流有一个单一的输入和输出。 我喜欢他们,因为它鼓励你建立了负责特定的任务小,功能组件。 然后,你可以链/重用他们,但是你认为合适的。
原帖
你要使用EventEmitter
这里有一个简单的例子
var events = require('events');
var util = require('util');
var SampleEmitter = function() {
events.EventEmitter.call(this);
this.sayHello = function() {
this.emit('hello', 'hello world');
};
};
util.inherits(SampleEmitter, events.EventEmitter);
var SampleListener = function(emitter) {
emitter.on('hello', function(data) {
console.log(data);
});
};
var se = new SampleEmitter();
var sl = new SampleListener(se);
se.sayHello(); //=> 'hello world'