Node.js Nodejs:如何处理对象之间的事件侦听?

Node.js Nodejs:如何处理对象之间的事件侦听?,node.js,javascript-events,module,publish-subscribe,commonjs,Node.js,Javascript Events,Module,Publish Subscribe,Commonjs,我目前的问题是,我有一个对象,应该听另一个对象 问题是:我应该如何处理订阅?目前,我只知道两种可能的方法: 注册人: var Registrator = function() { this.listener = new Listener(); }; Registrator.prototype.register = function(subsriber) { var self = this; subscriber.on('event', function(info) {

我目前的问题是,我有一个对象,应该听另一个对象

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

注册人:

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:

如果示例看起来过于抽象,那么以下是源代码:

检查构造函数以查看我的不满:)

Edit 根据您的评论,我不确定您对此有什么不可读的地方,但您可以尝试使用对象和优雅的方法

溪流 用法 我特别喜欢使用
对象。
pipe
方法非常方便:)每个流都有一个输入和输出。我喜欢它们,因为它鼓励您构建负责特定任务的小型功能组件。然后,您可以按照自己认为合适的方式链接/重用它们


原职 你会想用

这里有一个简单的例子

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'

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

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);
  });
};

您好,实际上我已经使用了EventEmitter(查看源代码)问题是如何以可读、灵活和干净的方式将侦听器添加到事件发射对象中。您认为流对于我在中的用例是一个好的决定吗?我认为流只适用于二进制文件或真正的网络流?我确实更需要松散耦合的事件
var Broadcaster = function(listener) {
  this.doSomething = function() {
    // do something...
    listener.doSomething(info);
  };
};
var Bridge = function(listener, broadcaster) {
  broadcaster.on("event", function(info) {
    // if necessary translate the arguments as well
    listener.doSomething(info);
  });
};