繁体   English   中英

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

[英]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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM