2016-08-19 71 views
0

有没有办法覆盖一些套接字事件?覆盖套接字事件(socketio)

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

像这样的事情

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

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

Standardmodules行动将不会被执行,因为会有一种方法来检测,已经有一些行动“someevent”(可选模块行为)设置。我希望很清楚,任何想法如何做到这一点?

回答

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(...)删除的单个听众。

+0

伟大的职位。非常感谢。 –