gpt4 book ai didi

node.js - 在允许继承事件冒泡之前捕获它

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:45 25 4
gpt4 key购买 nike

我目前正在开发一个实现 TCP/IP 封装协议(protocol)的类。我正在扩展 NodeJS Socket类(class)。我的问题是我需要阻止父事件冒泡并根据我的需要发出适当的事件。

这是我想要的说明,尽管我不确定如何实际实现它。

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 方法)?

最佳答案

你说的不是冒泡。它不像浏览器 DOM 中的事件那样在层次结构中向上冒泡。 Socket 对象是一个eventEmitter。当您和其他人都注册了 data 事件时,除了破解 eventEmitter 数据结构之外,您无法获取该事件,而注册该事件的其他人则无法获取该事件。事件发射器不是这样工作的。

据我所知,阻止他们获取该事件的唯一方法是覆盖他们对该事件的监听,并更改其监听器以监听您可以在需要时触发的其他事件,然后他们将永远不会看到 data 事件。

但是,如果套接字的客户端知道它是特殊类型的套接字,那么您应该只记录他们应该如何使用您的特殊类型的套接字,这样他们就不会首先监听 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);
}
}

请注意,如果您想自己监听 data 事件,则必须自己使用 super.on(...)super.addListener(...)

<小时/>

或者,如果您可以告诉您的客户使用不同的事件:

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(...);
});
}
}

关于node.js - 在允许继承事件冒泡之前捕获它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com