1

我有这个:

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),我看到函数 error:[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)覆盖。

睡不着

4

1 回答 1

0

我犯的一个大错误是我试图在假设循环数据将始终存在的情况下发送函数。相反,我收到了关键数据的参考。

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

多亏了ebohlman,因为这篇文章而想出来了

socket.io 使用 for 循环添加 socket.on 方法

function makeOn(key) {
  return function(data) {
    dummy.socketMethods[key].call(socket, data);
  }
}

for(key in dummy.socketMethods){
  socket.on(key, makeOn(key));
}
于 2012-10-19T14:12:11.483 回答