在nodejs中将事件传播给母类

时间:2017-06-13 19:37:23

标签: node.js events

在nodejs中的

我有一个main来创建一些会发出事件的对象。 其中一个是将监听gpio的digitalInput。

班级看起来像这样:

class dInput
{
  constructor(port, _id, _name, _messageBus)
  {
    this.gpio = new Gpio(port, {
        mode: Gpio.INPUT,
        pullUpDown: Gpio.PUD_DOWN,
        edge: Gpio.EITHER_EDGE
    });

    this.ID = _id;
    this.Name = _name;
    this.messageBus = _messageBus;

    this.gpio.on('interrupt', function(level){
        var details = {
            ID: this.ID,
            level: level,
            name: this.Name
        };
        DigitalInputsController.ReportChange(details);          
    });

    console.log("created"); 
  }
}

messageBus是我在main中创建的var messageBus = new events.EventEmitter();,我在创建它时传递给digitalInput。

当gpio的值发生变化时,事件链会正常启动但

这是我在主要听的方式:

messageBus.on("dInputChanged", function(data){
    console.log(data);
    socket.emit("ButtonStateChanged", data);
});

我收到的主要级别是:

{ ID: undefined, level: 0, name: undefined }

任何线索?

1 个答案:

答案 0 :(得分:2)

调用事件处理程序的上下文(this)是EventEmitter实例本身。

在这种特殊情况下,在'interrupt'上的this.gpio事件处理程序中,上下文将为this.gpio。要改为引用dInput实例,您需要使用覆盖this的箭头函数并将其设置为当前上下文:

this.gpio.on('interrupt', (level) => {
    var details = {
        ID: this.ID,
        level: level,
        name: this.Name
    };
    DigitalInputsController.ReportChange(details);          
});

或者您需要在事件处理程序之外添加var self = this;,并在事件处理程序中使用self.IDself.Name等。

您还可以使用eventHandler.bind()覆盖事件处理程序中的this,但这只是最近版本节点中的快速操作(例如v7.0.0 +)。