节点发射器:如何正确设计事件侦听器

时间:2014-06-25 02:51:10

标签: node.js scope this eventemitter

我是学习节点:

查看EventEmitter,默认情况下它通过将发射器作为 this 传递给事件监听器来执行回调,这样在事件监听器函数中, this 指的是EventEmitter对象。

我对这种情绪感到有些困惑,一个对象如何将自己注册为一个监听器并保持对其自身属性的引用?

考虑一下这个问题:

Meeting.prototype.recordStatement = function(name, statement) {
    this.minutes.push(name + " said " + statement);
};

使用这样的模式为自定义对象创建实例方法非常标准,但是这不会成为EventEmitter的监听器:如果我将会议的recordStatement实例方法附加到比方说,一个人/发射器发出的语句事件,我失去了对recordStatement监听器范围内的会议实例属性的访问权限,所以对于上面的例子,来自人的语句事件,this.minutes是未定义。

我想我可以在这里使用一个中间对象,它可以保存对会议实例的引用,但是,看起来很像布线。

我该如何设计呢?谢谢!

1 个答案:

答案 0 :(得分:1)

将函数调用包装在闭包中:

var self = this;
emitter.on('statement', function(name, statement) {
  self.recordStatement(name, statement);
});

或使用.bind()(可能比使用闭包慢):

emitter.on('statement', this.recordStatement.bind(this));