繁体   English   中英

将额外的参数传递给回调函数

[英]Passing extra arguments to callback function

websocketServer.on('connection', function(socket, req) {
  socket.on('message', onMessage);

  sub.subscribe('chat'); // sub: Redis subscription connection
  sub.on('message', onSubMessage);
});

function onMessage(message) {
  pub.publish('chat', message); // pub: Redis publishing connection
}

function onSubMessage(channel, message) {
  // how to access 'socket' from here?
  if (channel === 'chat') socket.send(message);
}

我试图摆脱尽可能少的状态和绑定,以提高WS服务器的效率,并有能力在我需要扩展的情况下仅添加更多计算机-状态只会使此事变得更加困难。 我仍然不了解有关节点内存管理和垃圾回收的所有知识。

在这种情况下,推荐的解决方案是什么? onSubMessage移至connection回调以访问socket 但是函数会在每个连接上初始化吗?

我还有其他选择吗?


关于此的小背景:

用户打开与服务器的WebSocket连接。 如果用户发送了一条消息,它将被发送到Redis频道(也可能称为Pub / Sub主题),该频道会将其广播到每个订阅的客户端( onSubMessage )。 Redis Pub / Sub充当集中广播者:我不必担心不同的服务器或状态,Redis向所有感兴趣的人发送消息。 无忧无虑的缩放。

您可以使用bind()预定义回调函数的额外参数:

...
sub.on('message', onSubMessage.bind(sub, socket));
...

function onSubMessage(socket, channel, message) {
  if (channel === 'chat') socket.send(message);
}

确实会为每个新连接创建一个新的函数实例,因此就内存使用而言,使用包装函数可能没有真正的好处。

暂无
暂无

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

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