在允许它冒泡之前捕获一个继承的事件

时间:2018-02-18 22:18:17

标签: node.js sockets javascript-events ecmascript-6

我目前正在开发一个实现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方法)???

1 个答案:

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