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

时间:2017-03-24 21:49:27

标签: 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 on a方法,输入,当收到“a”时,“控制台记录事件。

我也试过了socket.removeListener,但它没有用。

也许是因为它是一种类方法?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

this.a.bind(this)每次都会返回一个唯一的函数,因此当您尝试使用.off()并再次调用.bind()时,您将获得不同的函数,因此它不会被激活匹配原始文件,因此.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);
}

问题演示:



class Foo {
  constructor() {
    console.log(this.a.bind(this) === this.a.bind(this))
  }
  a() {
   
  }
}

let f = new Foo();