我有一个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 }
任何线索?
答案 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.ID
,self.Name
等。
您还可以使用eventHandler.bind()
覆盖事件处理程序中的this
,但这只是最近版本节点中的快速操作(例如v7.0.0 +)。