removeAllListeners() 根本不删除侦听器? (Socket.IO)

Posted

技术标签:

【中文标题】removeAllListeners() 根本不删除侦听器? (Socket.IO)【英文标题】:removeAllListeners() doesn't remove listeners at all? (Socket.IO) 【发布时间】:2020-07-29 20:10:38 【问题描述】:

我在我的 Angular 8 应用程序中使用 socket.io-client

我正在使用如下所示的服务:

private socket: SocketIOClient.Socket;
private _alertsObservable: Observable<Alert> = Observable.create();

constructor(channelService : MyChannelService) 
    this.socket = io(environment.socketServer);
  

refreshAlertsObservable() 
    console.log('This prints once when called')'
    this.socket.removeAllListeners();
    this._alertsObservable = Observable.create(observer => 
      channelService.channelArray.forEach(
        channel => 
          this.socket.on(channel.number.toString(), alert => 
            console.log('This prints multiple times')'
            observer.next(alert);
          );
        
      )
    );
  

每当我检测到对channelService 进行更改时,我都会在refreshAlertsObservable() 上运行。

每当我执行this.socket.on()... 时,似乎它会向channel.number 添加多个侦听器,据我所知,这是设计使然)。 这就是我事先运行this.socket.removeAllListeners(); 的原因。但是,它似乎不起作用,因为一旦发出消息,“This prints multiple times”就会不断打印多个。 我还尝试用addEventListener() 替换on() 并且行为是相同的。

谢谢

【问题讨论】:

您有任何小型 github 存储库来重现您的问题吗? 【参考方案1】:

RemoveAllListeners 期望您正在收听的事件名称数组。尝试维护在数组中创建的侦听器并将其传递给函数。 请您尝试以下方式:

socket.removeAllListeners([eventName])

更多信息请参考Socket documentation

还有其他类似的方法可用,例如 off、removeListener 等,您可以尝试一下。

---编辑---

或者,如果代码中的套接字实例“socket”是 angular 返回的包装器,它可能只有 on 和 emit 函数,请尝试打印该对象并使用以下方法调用它:

socket.getSocket().removeAllListeners();

【讨论】:

我用的是socket.io-client,removeAllListeners()的签名没有任何参数 你请尝试控制台套接字对象并检查你在那里得到什么?如果您的套接字只有 emit 和 on 和 getSocket 函数,那么请尝试编辑后的帖子@noamyg Property 'getSocket' does not exist on type 'Socket'.

以上是关于removeAllListeners() 根本不删除侦听器? (Socket.IO)的主要内容,如果未能解决你的问题,请参考以下文章

“校长风暴”来袭,《诺亚幻想》不删档数据惊艳

Pubnub 正在向多个 uuid 发送心跳?

[经验] Win7减肥攻略(删文件不删功能简化优化系统不简优化性能)

不删库不跑路 -- 数据库优化

Samba(只写不删)搭建备份服务器

python不删库的情况下,更新复杂冲突的数据库