从socket.io中删除特定的类方法侦听器

从socket.io中删除特定的类方法侦听器,socket.io,Socket.io,我正在类中使用socket.io-client,因此: constructor() { socket.on("a", this.a.bind(this)); socket.off("a", this.a.bind(this)); } 但是,当我构造on和off时,套接字仍然侦听a 我测试这一点的方法是在方法上输入console.log,然后在收到控制台时记录事件 我还尝试了socket.removeListener,但没有成功 也许是因为它是一个类方法?如何解决此问题?this.a

我正在类中使用socket.io-client,因此:

constructor() {
   socket.on("a", this.a.bind(this));
   socket.off("a", this.a.bind(this));
}
但是,当我构造on和off时,套接字仍然侦听a

我测试这一点的方法是在方法上输入console.log,然后在收到控制台时记录事件

我还尝试了socket.removeListener,但没有成功

也许是因为它是一个类方法?如何解决此问题?

this.a.bind每次尝试使用时都会返回一个唯一的函数,因此当您再次调用.off.bind时,您会得到一个不同的函数,因此它与原始的so不匹配。off找不到任何匹配的函数来删除

您必须将原始绑定函数保存到某个位置。您没有显示足够的代码上下文,无法知道保存原始.bind结果的好位置

从概念上讲,您希望执行以下操作:

// save this somewhere that is per-instance and that both methods can access
// perhaps as an instance variable from the constructor
this.boundA = this.a.bind(this);

ngOnInit() {
   socket.on("a", this.boundA);
}
ngOnDestroy() {
   socket.off("a", this.boundA);
}
本期演示:

福班{ 建造师{ console.logthis.a.bindthis===this.a.bindthis } a{ } }
设f=新Foo;它侦听,因为请求中的keep-alive标头。您无法修复此问题。@RomanC如果我这样做:socket.removealllistener它会停止此侦听器,因此有一种方法可以停止它。我正在寻找一种更具体的方法,它不起作用。@RomanC你为什么这么说?删除所有侦听器确实有效。您有哪个协议套接字?我不知道bind创建了一个唯一的函数,我将更改逻辑以反映上述情况,并将更新。将是一天左右,谢谢。@Amit-请在我添加到答案的片段中自己尝试一下。谢谢!请查看编辑,因为它仍然无法工作,即使我在另一个varaibleMy错误中保存,我有一个调用回调函数的函数,而不是将其传递给套接字。改变了,它成功了