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

时间:2017-04-29 01:56:24

标签: javascript node.js socket.io

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

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

但" eventname"可以是任何字符串。

他们是如何实现这一目标的?他们如何为每个可能的字符串都有一个事件监听器?他们是否在消息进入时添加事件监听器?

我已经尝试过阅读SocketIO源代码了,但它完全超出了我的想法。

1 个答案:

答案 0 :(得分:4)

可以在文档中找到答案:

来自source code of Socket.IO

socket.on(eventName, callback)

(inherited from EventEmitter)

来自here

  

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

基本上,socket将按名称键入的事件映射保存到接收到该事件时调用的函数数组。

如果您查看EventEmitter.on的{​​{3}},您会发现它非常愚蠢 - 它并不会检查您是否两次添加相同的功能:

  

.on() - >将侦听器函数添加到侦听器数组的末尾   名为 eventName 的活动。没有检查是否有听众   已被添加。多个调用传递相同的组合   eventName和listener将导致添加侦听器,并且   多次打电话。