socket.io:如何从对象动态调用socket方法?

时间:2012-10-19 03:55:28

标签: javascript node.js sockets 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:\__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);
        });
    }
});

套接字不会传递给函数。

如何动态调用方法,仍然可以在方法中使用socket?

更新:

使用这个完整的代码:

io.sockets.on('connection', function(socket) {
    for(key in socketMethods){
        socket.on(key, function(data){
            socketMethods[key](data, socket);
        });
    }
});

我发现了一些非常有趣的东西。

它可以工作,我可以从方法运行socket.emits!

然而,现在,它只运行LAST方法。在这种情况下,无论要求什么,都会调用action3。如果您要求action1或action 2,则仍会调用操作3。

更新:

运行console.log(socket._events),我看到函数错误:[function],action1:[function],action2:[function],action3:[function] ARE附加。当我试图看到每个函数中的内容时,我得到的只是。

function ack() {
      self.packet({
          type: 'ack'
        , args: io.util.toArray(arguments)
        , ackId: packet.id
      });
    }

无论我发送给自己的功能如何。我还设置了action2,成为对象中的最后一件事,而action2就是所谓的。然而。当我将socket.on方法附加到-normal-way时,它们在socket._events中看起来完全相同。

我有一个理论认为所有方法都被“最后”动作(action3)覆盖。

无法入睡

1 个答案:

答案 0 :(得分:0)

我犯的大错是我试图发送函数假设循环数据总是持续存在。我正在接收关键数据的参考。

我将不得不做更多的研究,但我们需要创建一个函数

因为这篇文章想出来,感谢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));
}