我有这个:
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:\__server\nodejs.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!
但是,现在,它只运行 LAST 方法。在这种情况下,无论请求什么,都会调用 action3。如果您请求操作 1 或操作 2,则仍会调用操作 3。
更新:
运行 console.log(socket._events),我看到附加了函数错误:[function]、action1:[function]、action2:[function]、action3:[function]。当我尝试查看每个函数中的内容时,我得到的只是。
function ack() {
self.packet({
type: 'ack'
, args: io.util.toArray(arguments)
, ackId: packet.id
});
}
不管我发回给自己的函数是什么。我还设置了action2,作为对象中的最后一个东西,而action2就是被调用的。然而。当我以正常方式附加 socket.on 方法时,它们在 socket._events 中看起来完全相同。
我有一个理论,即所有方法都被“最后一个”操作(action3)覆盖。
睡不着
最佳答案
我犯的一个大错误是,我试图在假设循环数据始终持续存在的情况下发送函数。相反,我收到了关键数据的引用。
我必须做更多研究,但我们需要创建一个函数
由于这篇文章而弄清楚了这一点,感谢 ebohlman
socket.io Using a for loop to add socket.on methods
function makeOn(key) {
return function(data) {
dummy.socketMethods[key].call(socket, data);
}
}
for(key in dummy.socketMethods){
socket.on(key, makeOn(key));
}
关于javascript - 套接字.io : How do I call upon my socket methods dynamically from an object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12967164/