2017-06-13 48 views
0

in nodejs我有一个主创建了一些会发出事件的对象。 其中之一是将会听gpio的digitalInput。在nodejs中将事件传播到母类中

类是这样的:

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我,我在主创造,创造,当我传递给digitalInput一个var messageBus = new events.EventEmitter();

当的GPIO的值改变,事件链正常启动,但什么

这是我听在主:

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

我收到一个主要层面是:

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

任何线索?

回答

2

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

在这种特殊情况下,上的'interrupt'事件处理程序中的上下文将为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 +)中的快速操作。

+0

我会检查并报告,谢谢! – javirs

+0

完全作品!谢谢 ! – javirs