【问题标题】:socket.io : How do I call upon my socket methods dynamically from an object?socket.io:如何从对象动态调用我的套接字方法?
【发布时间】:2012-10-19 03:55:27
【问题描述】:

我有这个:

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。如果您请求 action1 或 action 2,仍会调用 action 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)覆盖。

睡不着

【问题讨论】:

  • 我不确定它是否会修复它,但在您最后的尝试中,请尝试socket.on(key, function () { socketMethods[key](data, socket); });。无论哪种方式,请记住,如果您将socket 作为第二个参数传递,则必须更新socketMethods 对象中的方法以接受第二个参数。
  • 谢谢,但没有骰子。 socket.on(key, server.socket[key](data, socket)); ReferenceError:数据未定义
  • 抱歉,我没认出一些东西。看我的回答——我刚刚更新了,我更新了原文(针对data参数)

标签: javascript node.js sockets socket.io


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 2012-04-08
    • 1970-01-01
    • 2018-12-11
    • 2011-09-25
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多