较旧的问题,但遇到了类似的事情,所以我想我会分享一种方法来做到这一点。
客户端
因此,在客户端上,不要将事件作为第一个参数传递给发出,而是使用通用事件名称,比如event
或其他东西。我最终使用了应用程序的名称,因为它很短。然后在数据对象中,传入你要调用的函数的名称。
所以这:
socket.emit('awesomeSocketEvent', {hello: 'world'});
变成:
socket.emit('genericEvent', {event:'awesomeSocketEvent', hello:'world'});
重写客户端上的所有内容都很糟糕,而且我的客户端内容大多只是 -emit
所以我将 socket.io 客户端包装在另一个对象中,并使用它自己的发出事件来更改事件名称和数据对象。
服务器端
现在在服务器端只有一个自定义事件称为 , genericEvent
,因此需要将自定义事件重组为对象的属性。一旦发生这种情况,它会简单地检查事件是否存在于对象中,如果存在则调用它,如果不存在则执行其他操作。
io.sockets.on('connection', function (socket) {
var events = {
awesomeSocketEvent: function(data){
// do your socket stuff here
}
};
socket.on('genericEvent', function(data){
if(data.event in events){
events[data.event](data);
} else {
// do your unknown event stuff here
}
});
});
在编写该部分时查看代码后,我不确定在连接事件中声明事件对象的性能。最好events
在连接事件之外声明,然后传递socket
给您的所有函数。