我有这个:
io.sockets.on('connection', function(socket) {
socket.on("action1", function(data){
socket.emit("action1", data);
});
socket.on("action2", function(data){
socket.emit("action2", data);
});
socket.on("action3", function(data){
socket.emit("action3", data);
});
});
我想要这个:
var socketMethods = {
action1:function(data, socket){
socket.emit("action1", data);
},
action2:function(data, socket){
socket.emit("action2", data);
},
action3:function(data, socket){
socket.emit("action3", data);
}
}
io.sockets.on('connection', function(socket) {
for(key in socketMethods){
socket.on(key, socketMethods[key]);
}
});
但是,我无法将插座传递到该方法中,最终得到了
C:__servernodejs.js:217
socket.emit('action1', {msg:"No account"}
^
TypeError: Cannot call method 'emit' of undefined
我尝试通过插座通过该功能:
io.sockets.on('connection', function(socket) {
for(key in socketMethods){
socket.on(key, function(data, socket){
socketMethods[key](data, socket);
});
}
});
插座没有传递到功能中。
如何动态调用该方法,并且仍然能够在方法中使用套接字?
更新:
使用此确切的代码:
io.sockets.on('connection', function(socket) {
for(key in socketMethods){
socket.on(key, function(data){
socketMethods[key](data, socket);
});
}
});
我发现了一些非常有趣的东西。
它确实有效,我可以从该方法运行socket.emits!
现在,它只是运行最后一个方法。在这种情况下,无论需要什么,Action3被称为。如果您要求采取行动1或动作2,则动作3仍被调用。
更新:
运行控制台.log(socket._events),我看到函数错误:[function],action1:[function],action2:[function2:[function],action3:[function 3:[function]]。当我尝试查看每个功能中的内容时,我得到的只是。
function ack() {
self.packet({
type: 'ack'
, args: io.util.toArray(arguments)
, ackId: packet.id
});
}
不管我发给自己的功能如何。我还将Action2设置为对象中的最后一件事,而Action2就是所谓的。然而。当我连接插座。
我有一个理论,即所有方法都被"最后"动作覆盖(Action3)。
不能睡觉
我犯的大错误是我试图在假设循环数据始终持续存在时发送功能。相反,我正在收到关键数据的参考。
我必须做更多的研究,但是我们需要创建一个函数
由于这篇文章而弄清楚了,这要归功于ebohlman
socket.io使用for loop添加socket.on方法
function makeOn(key) {
return function(data) {
dummy.socketMethods[key].call(socket, data);
}
}
for(key in dummy.socketMethods){
socket.on(key, makeOn(key));
}