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)的主要内容,如果未能解决你的问题,请参考以下文章