我愉快地写了一个node.js服务器,它使用socket.io与客户端通信。 这一切都运作良好。 socket.on('connection'...)处理程序有点大,这让我想到了另一种组织我的代码并在这样的生成器函数中添加处理程序的方法:
sessionSockets.on('connection', function (err, socket, session) {
control.generator.apply(socket, [session]);
}
生成器获取一个包含套接字事件及其各自处理函数的对象:
var config = {
//handler for event 'a'
a: function(data){
console.log('a');
},
//handler for event 'b'
b: function(data){
console.log('b');
}
};
function generator(session){
//set up socket.io handlers as per config
for(var method in config){
console.log('CONTROL: adding handler for '+method);
//'this' is the socket, generator is called in this way
this.on(method, function(data){
console.log('CONTROL: received '+method);
config[method].apply(this, data);
});
}
};
我希望这会将套接字事件处理程序添加到套接字中,但是当任何事件进入时,它总是调用添加的最新事件,在这种情况下总是b函数。
任何人都知道我在这里做错了什么?
答案 0 :(得分:3)
问题出现是因为那时this.on
回调触发(假设在绑定后几秒钟内),for
循环结束,method
变量成为最后一个值
要解决这个问题,你可以使用一些JavaScript魔法:
//set up socket.io handlers as per config
var socket = this;
for(var method in config){
console.log('CONTROL: adding handler for '+method);
(function(realMethod) {
socket.on(realMethod, function(data){
console.log('CONTROL: received '+realMethod);
config[realMethod].apply(this, data);
});
})(method); //declare function and call it immediately (passing the current method)
}
当你第一次看到它时,这种“神奇”很难理解,但是当你得到它时,事情变得清晰:)