【问题标题】:How to disable event listener for socket when user disconnects?用户断开连接时如何禁用套接字的事件侦听器?
【发布时间】:2014-08-28 14:49:33
【问题描述】:

我正在使用适用于 Node.js 的 Twit 库,我首先在此处创建传入推文流:

var stream = T.stream('statuses/filter', { locations: allLocations })

然后,使用 Socket.io,我将推文发送到每个连接的客户端,并在用户断开连接时记录:

io.on('connection', function(socket){
  socket.on('disconnect', function() {
    console.log("User disconnected!!!!!"); 
  });
  stream.on('tweet', function(tweet) {
    // sends tweet to client in question:
    socket.emit('info', tweet);
  });
}

问题在于,即使在用户断开连接后,为他们准备的推文仍会继续被事件侦听器解析,并记录到控制台。当用户断开连接时,有没有办法“禁用”所有与套接字相关的事件侦听器?或者有没有更简洁的方法来处理流式推文的这种情况?

【问题讨论】:

  • 为什么不在断开连接事件时销毁流?
  • @SalvadorDali - 需要为仍然连接的用户运行它

标签: node.js twitter socket.io


【解决方案1】:

这里有一个解决方案:

io.on('connection', function(socket){
  socket.on('disconnect', function() {
    console.log("User disconnected!!!!!"); 
    stream.removeListener('tweet', onTweet);
  });
  function onTweet(tweet) {
    // sends tweet to client in question:
    socket.emit('info', tweet);
  }
  stream.on('tweet', onTweet);
}

此外,您可以使用单个“tweet”事件处理程序向所有套接字广播,而不是为每个连接添加一个新的“tweet”事件处理程序。

【讨论】:

  • 不幸的是,我认为您的代码行不通,因为stream.removeListener 可能会删除其他用户的推文侦听器。但是我认为您正在使用单个“推文”事件处理程序的想法。我正在考虑将所有活动套接字放入一个数组中,然后在“tweet”事件处理程序中遍历它们以将消息发送给所有客户端。这样,您只需要一个处理程序。
  • 试一试,然后报告
  • onTweet 是为每个连接创建的,并且是每个连接的本地。所以当socket断开连接时,移除监听器的时候会有正确的引用。这和你之前做的一样,除了匿名函数被拉出并命名(所以它可以很容易地删除)。
  • 明白了。我试过了,我认为这正是我需要做的
猜你喜欢
  • 1970-01-01
  • 2011-04-29
  • 2014-03-20
  • 2011-12-10
  • 2013-02-11
  • 2016-11-19
  • 1970-01-01
  • 2020-12-31
  • 2021-10-14
相关资源
最近更新 更多