socket.io:如何从对象动态地调用套接字方法



我有这个:

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));
}

最新更新