Node.js 将事件传播到nodejs中的母类

Node.js 将事件传播到nodejs中的母类,node.js,events,Node.js,Events,在nodejs中,我有一个main来创建一些将发出事件的对象。 其中之一是将监听gpio的数字输入 这个类看起来像这样: class dInput { constructor(port, _id, _name, _messageBus) { this.gpio = new Gpio(port, { mode: Gpio.INPUT, pullUpDown: Gpio.PUD_DOWN, edge: Gpio.EITHER_EDGE

在nodejs中,我有一个main来创建一些将发出事件的对象。 其中之一是将监听gpio的数字输入

这个类看起来像这样:

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 i a
var messageBus=new events.EventEmitter()是我在main中创建的,并且在创建时传递给digitalInput

当gpio的值发生变化时,事件链会正确启动,但是什么呢

以下是我在主会场的聆听方式:

messageBus.on("dInputChanged", function(data){
    console.log(data);
    socket.emit("ButtonStateChanged", data);
});
我收到的主要级别是:

{ ID: undefined, level: 0, name: undefined }
有什么线索吗

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

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

this.gpio.on('interrupt', (level) => {
    var details = {
        ID: this.ID,
        level: level,
        name: this.Name
    };
    DigitalInputsController.ReportChange(details);          
});
或者您需要添加一个
var self=this,并在事件处理程序中使用
self.ID
self.Name

您也可以使用
eventHandler.bind()
在事件处理程序中重写
,但这只是node的最新版本(例如v7.0.0+)中的一个快速操作。

调用事件处理程序的上下文(
)是
事件发射器
实例本身

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

this.gpio.on('interrupt', (level) => {
    var details = {
        ID: this.ID,
        level: level,
        name: this.Name
    };
    DigitalInputsController.ReportChange(details);          
});
或者您需要添加一个
var self=this,并在事件处理程序中使用
self.ID
self.Name

您还可以使用
eventHandler.bind()
在事件处理程序中重写
,但这只是node的最新版本(例如v7.0.0+)中的一个快速操作