使用SocketIO时,接收任何消息都是这样完成的:
socket.on("eventname", function() {
// Whatever
}
但" eventname"可以是任何字符串。
他们是如何实现这一目标的?他们如何为每个可能的字符串都有一个事件监听器?他们是否在消息进入时添加事件监听器?
我已经尝试过阅读SocketIO源代码了,但它完全超出了我的想法。
答案 0 :(得分:4)
可以在文档中找到答案:
socket.on(eventName, callback)
(inherited from EventEmitter)
来自here:
在内部, EventEmitter 会跟踪调用的对象 将事件名称映射到事件处理程序数组的 this.events 。当一个 程序使用事件名称和事件处理程序调用on方法 EventEmitter 将处理程序添加到该事件名称的数组中。
基本上,socket
将按名称键入的事件映射保存到接收到该事件时调用的函数数组。
如果您查看EventEmitter.on
的{{3}},您会发现它非常愚蠢 - 它并不会检查您是否两次添加相同的功能:
.on() - >将侦听器函数添加到侦听器数组的末尾 名为 eventName 的活动。没有检查是否有听众 已被添加。多个调用传递相同的组合 eventName和listener将导致添加侦听器,并且 多次打电话。