从socket.io处理程序访问父作用域

时间:2015-04-21 20:18:22

标签: javascript node.js scope socket.io

我的代码如下:

io.on("connection", function(socket) {
    socket.on("req1", Handler1);
});


var Handler1= function(args1)
{
   console.log(args1);
   socket.emit('resp1', {id: 21321});  <---- ERROR - Socket not defined
}

知道如何在Handler1中访问套接字obj?声明全局对象并为其分配套接字有效,但我不知道它是否是一个好的解决方案?许多客户端与服务器的连接会发生什么?

3 个答案:

答案 0 :(得分:0)

您可以在on设置中定义处理程序:

io.on("connection", function(socket) {

  var Handler1= function(args1)
  {
     console.log(args1);
     socket.emit('resp1', {id: 21321});
  }

  socket.on("req1", Handler1);
});

或者,如果需要在其他地方重用Handler1,请为其添加socket参数,并从包装函数中调用它:

var Handler1= function(socket, args1)
{
   console.log(args1);
   socket.emit('resp1', {id: 21321});
}

io.on("connection", function(socket) {
  socket.on("req1", function(a) { Handler1(socket, a); } );
});

答案 1 :(得分:0)

你可以绑定它:

io.on("connection", function(socket) {
    socket.on("req1", create_handler(socket));
});


function create_handler(socket) {
    return function (args1) { // we return the handler function that now has access to socket
        console.log(args1);
        socket.emit('resp1', {id: 21321});
    };
}

或者,如果您不需要重用处理程序构造,则可以将其全部内联:

io.on("connection", function(socket) {
    socket.on("req1", function (args1) {
        console.log(args1);
        socket.emit('resp1', {id: 21321});
    });
});

答案 2 :(得分:0)

您在定义“socket”变量的范围之外定义“Handler1”函数。如果在“连接”处理程序中定义处理程序,它将具有使用的引用。

   io.on("connection", function(socket) {
        var Handler1 = function(args1) {
            console.log(args1);
            socket.emit('resp1', {id: 21321}); 
        }
        socket.on("req1", Handler1);
    });