[英]socket.io : How do I call upon my socket methods dynamically from an object?
我有这个:
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中看起来完全一样。
我有一个理论,所有方法都被“最后一个” action(action3)覆盖。
无法入睡
我犯的一个大错误是,我在假定循环数据将始终存在的情况下尝试发送该函数。 相反,我收到了关键数据的参考。
我将需要做更多的研究,但相反,我们需要创建一个函数
由于有这篇文章,所以想通了这个,多亏了ebohlman
function makeOn(key) {
return function(data) {
dummy.socketMethods[key].call(socket, data);
}
}
for(key in dummy.socketMethods){
socket.on(key, makeOn(key));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.