我目前正在开发一个实现TCP / IP封装协议的类。我正在扩展NodeJS Socket
类。我的问题是我需要阻止父事件冒泡并根据我的需要发出适当的事件。
以下是我想要的说明,但我不确定如何实际实现它。
const { Socket } = require("net");
class Sample extends Socket {
constructor() {
super();
}
// How do I catch and prevent the parent event from bubbling
super.on('data', data => {
functionsToStopBubbling();
if(data.toString() === "foo") {
this.emit('event1', 1);
} else {
this.emit('event2', 2);
}
}
}
关于如何做到这一点的任何想法(最好是ES2015方法)???
答案 0 :(得分:2)
你所说的不是冒泡。它不像浏览器DOM中的事件冒泡层次结构。 Socket对象是eventEmitter
。如果您和其他人都注册了data
事件,那么您无法获得该事件(而不是黑客攻击eventEmitter数据结构),而不能注册其他人。事件发射器就是不能那样工作。
我知道阻止他们获取它的唯一方法是覆盖他们对该事件的倾听并改变他们的倾听者以听取你想要的时候可以触发的其他事件然后他们永远不会查看data
事件。
但是,如果您的套接字的客户端知道它是一种特殊类型的套接字,那么您应该记录他们应该如何使用您的特殊类型的套接字,这样他们就不会#39 ; t首先听取data
事件。告诉他们应该听哪些事件。
以下是拦截他们注册data
事件的方法:
class Sample extends Socket {
constructor() {
super();
// now listen for the data event
super.on('data', function(data) {
// do something with incoming data
});
}
addListener(name, fn) {
// intercept registering for data event
if (name === 'data') {
// change their listener to "myData" so I can trigger
// when I want to and they won't get normal data events
return super.addListener("myData", fn);
} else {
// let it go through to base class
return super.addListener(name, fn);
}
}
on(name, fn) {
return this.addListener(name, fn);
}
}
注意,如果您想亲自听取super.on(...)
活动,则必须自己使用super.addListener(...)
或data
。
或者,如果您可以告诉您的客户使用不同的事件:
class Sample extends Socket {
constructor() {
super();
// now listen for the data event
this.on('data', function(data) {
// do something with incoming data
// and then emit some other events
this.emit(...);
});
}
}