SocketIO如何为任何给定事件使用通用.on()事件?

当使用SocketIO时,接收任何消息都是这样完成的:

socket.on("eventname", function() { // Whatever } 

但是“eventname”可以是字面上的任何string。

他们是怎么做到的? 他们如何为每一个可能的string都有一个事件监听器? 他们添加事件侦听器,作为消息进来?

我尝试过读取SocketIO的源代码,但是它已经超出了我的头脑。

答案可以在文档中find:

从Socket.IO的源代码 :

 socket.on(eventName, callback) (inherited from EventEmitter) 

从这里 :

在内部, EventEmitter跟踪一个名为this.events的对象,该对象将事件名称映射到事件处理程序的数组。 当程序使用事件名称和事件处理程序调用on方法时, EventEmitter将该处理程序添加到数组中,以获取该事件名称。

所以,基本上, socket保持一个事件的地图,按名称键入一个函数的数组,当收到事件时被调用。

如果你看看EventEmitter.on的文档 ,你会发现它非常愚蠢 – 它不检查你是不是两次添加相同的函数:

.on() – >将侦听器函数添加到名为eventName的事件的侦听器数组的末尾。 没有检查是否已经添加了侦听器。 传递相同的eventName和listener组合的多个调用将导致多次添加和调用侦听器。