【问题标题】:Node emitter : how to properly design event listeners节点发射器:如何正确设计事件监听器
【发布时间】:2014-08-15 11:19:37
【问题描述】:

我正在学习节点:

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

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

考虑这个问题:

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

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

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

我应该如何为此设计?谢谢!

【问题讨论】:

    标签: node.js scope this eventemitter


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这行得通。在其他 ECMAScript 实现中,将 null 作为第一个参数传递给 apply,就像在 myFunciton.apply(null, [1, 2]) 中一样,使函数绑定到其父级。我不知道在 JavaScript 中这样做会传递全局对象。
    猜你喜欢
    • 2015-01-23
    • 2015-02-27
    • 2020-12-25
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多