在处理程序之外传递对象引用,即使其全局化

Passing a object reference outside of handler, ie make it global

本文关键字:全局 对象引用 程序 处理      更新时间:2023-09-26

这更像是我假设的最佳实践问题,但在下文中,谁能告诉我如何将套接字对象的引用传递到它所在的方法处理程序之外?

io.on('connection', function (socket) {
       console.log('connection '+socket);
//do stuff here
});//end callback handler
//need a reference to socket here!!

只是将其分配给该范围内定义的变量?

var globalSocket;
io.on('connection', function (socket) {
  globalSocket = socket;
});
// now what?

但是,我认为没有理由这样做,因为在调用事件处理程序之前您将无法使用该值(您只知道何时调用事件处理程序)。

要解决这个问题,您需要将需要访问套接字的代码放在函数中,并从事件处理程序调用该函数:

var globalSocket;
io.on('connection', function (socket) {
  globalSocket = socket;
  doSomething();
});
function doSomething() {
  // do something with globalSocket
  console.log(globalSocket);
}

但是,将socket作为参数传递给函数会更加优雅:

io.on('connection', function (socket) {
  doSomething(socket);
});
function doSomething(socket) {
  // do something with socket
  console.log(socket);
}

好吧,您必须将其存储在某种套接字连接池中。但请记住,如果您想使用负载均衡器在多个进程/机器中分发,这将不能很好地工作。