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

时间:2017-09-26 10:49:06

标签: javascript node.js

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会向所有感兴趣的人发送消息。无忧无虑的扩展。

1 个答案:

答案 0 :(得分:2)

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

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

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

这个 为每个新连接创建一个新的函数实例,因此在内存使用方面使用包装函数可能没有真正的好处。