覆盖套接字事件(socketio)

时间:2016-08-19 14:37:13

标签: websocket socket.io

有没有办法覆盖某些套接字事件?

我希望能够加载可以覆盖标准模块的可选模块。

像这样的东西

socket.on('someevent', function() {
  //Optional modules actions
})

socket.on('someevent', function() {
  //Standardmodules actions
})

标准模块操作将不会被执行,因为有一种方法可以检测到已经为某些事件设置了一些操作' someevent' (可选模块操作)。我希望它清楚,知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

socket.io套接字继承自EventEmitter对象以及.on()来自的对象。因此,您可以使用EventEmitter上的各种方法来查看安装了哪些事件处理程序。例如,你可以这样做:

socket.listeners('someevent')

它将返回一个函数数组,这些函数作为该事件的事件处理程序安装。

或者,您可以这样做:

socket.eventNames()

它将返回一个事件名称数组,至少有一个处理程序。

eventEmitter没有提供覆盖"覆盖"另一个事件处理器要手动执行此操作,您可以清除上一个事件侦听器,然后安装新的事件侦听器。

例如,这是一个覆盖功能:

EventEmitter.prototype.override = function(event, fn) {
    this.removeAllListeners(event);
    this.on(event, fn);
}

那么,你可以在这样的套接字上使用它:

socket.override('someevent', myHandler);

注意:EventEmitters旨在支持许多侦听器,因此许多不同的代码可以监视同一个发射器。因此,以这种方式强制覆盖是一种蛮力的做事方式,并且通常不会被推荐,因为它可能无意中混淆了监视套接字活动的其他代码。最好使用.removeListener(...)删除要删除的单个侦听器。