javascript - 套接字.io : How do I call upon my socket methods dynamically from an object?

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

套接字不会传递到函数中。

如何动态调用这些方法,并且仍然能够在方法中使用套接字?

更新:

使用这个确切的代码:

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 中看起来完全相同。

我有一个理论,即所有方法都被“最后一个”操作(action3)覆盖。

睡不着

最佳答案

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

我必须做更多研究,但我们需要创建一个函数

由于这篇文章而弄清楚了这一点,感谢 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));
}

关于javascript - 套接字.io : How do I call upon my socket methods dynamically from an object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12967164/

相关文章:

node.js - 当我在 React 应用程序中使用 Heroku 配置变量时,它们返回为未定义

c# - C#中异步套接字类的设计

c++ - boost::asio::ip::tcp::socket -> 如何查询套接字状态?

javascript - 使用 parseFloat 时,React onChange 正在吞下我的小数点

linq - 使用(Linq for JavaScript 库)子查询(操作方法)

javascript - 使用正则表达式的URL “starts with”?

javascript - 如何使用 Node.js、EJS 模板和动态文件名进行多重渲染

node.js - 套接字 Io 未找到 404

java - 使用 TCP/IP 在两台不同的计算机之间进行通信

javascript - $.each 抛出错误 : Cannot use 'in' operator to search for '37' in