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组合的多个调用将导致多次添加和调用侦听器。