我试图从我的socket.on()
事件中分解出匿名回调函数,原因有两个:
由于第一个原因更多是个人偏好,我不会解决它 - 尽管我对看到风格指南和/或一般建议非常感兴趣。
第二个原因是因为我看到socket.io使用的唯一方法就是这样:
var io = require('socketio');
io.on('connection', function(socket) {
socket.on('event', function(data) {
// logic goes here
socket.emit('different event', differentData);
});
});
这可以很好地工作,但我相信匿名函数是为每个传入连接实例化的。
我会通过以下方式解决这个问题:
io.on('connection', function(socket) {
socket.on('event', eventHandler);
function eventHandler(data) {
// logic goes here
socket.emit('different event', differentData);
});
});
但是,似乎仍然会创建一个' eventHandler'对于每个新连接。
我目前对此进行分解的尝试如下:
var sockets = {}
io.on('connection', function(socket) {
socket.on('login', login.bind(socket));
socket.on('get information', getInformation);
});
function login(data) {
// logic goes here
// Save the socket to a persistent object
sockets[data.userId] = this;
this.emit('logged in', loginData);
});
function getInformation(data) {
// authentication, db access logic goes here
// Avoid binding by using previously stored socket
sockets[data.userId].emit('got information', infoData);
});
这有效,但我相信bind()只是创建了另一个函数,无论如何,颠覆了login
回调中不包括connection
回调的任何实际好处。
至于其他处理程序,似乎需要一个持久对象,如EtherPad's method (SocketIORouter.js:62)所示。由于我打算收听相当多的事件,似乎从connection
回调中提取回调是最好的方法。也许bind会在每次调用时创建一个新函数,但在这种情况下,每个连接只会被称为两次而不是10-20次。我想,对于成千上万的客户来说,这会有所作为,但我不确定。
所以,总而言之,这是一种正确的方法,还是我应该使用更好的方法?或者,这只是另一种过早优化的情况吗?