删除处理程序本身的事件处理程序

简而言之:我想在自己的调用中将绑定的结果作为一个争论

var bound = foo.bind(this,bound); 

因为我不知道如何解决我的问题。

问题:

我有一个项目是依赖于其他项目的数组。 一旦这些项目之一被删除,我想删除依赖项, 并删除所有的依赖关系上放置的监听器

我正在努力去除其他依赖项的事件处理程序。 我试图使用绑定,但由于处理函数是一个删除监听器,我发现我将不得不绑定bind()调用的结果在自己的调用作为参数。 这当然不起作用。

绑定调用bellow将未绑定的“handler”版本作为参数绑定,因此removeEventListener不起作用,因为它是函数的不同副本。

问题是:我可以使用绑定来做这个和/或我该如何解决这个问题?

我使用eventemitter3 ,但它应该是相同的任何事件库。

 setHandlers(dependentItem,dependencies) { var handler = this.onDependencyRemoved; handler = handler.bind(this,dependentItem,dependencies,handler);//bind itself as third argument dependencies.forEach(dependency => { dependency.addEventListener("removed",handler); }); } onDependencyRemoved(dependentItem,dependencies,handler) { dependentItem.remove(); dependencies.forEach(dependency => { dependency.removeEventListener("removed",handler); }); } 

编辑:

完整的工作示例在nodejs中运行:

 const EventEmitter = require('events'); //const EventEmitter = require('eventemitter3'); class MyEmitter extends EventEmitter { remove() { console.log("I'm being removed, this should happen only once"); } } var dependent = new MyEmitter(); var dependencies = [new MyEmitter(),new MyEmitter()]; var handler = (e) => removeHandler(dependencies,dependent,handler); dependencies.forEach(dependency => dependency.once('removed',handler)); var removeHandler = function(dependencies,dependent,handler) { //remove the dependent object because one of the dependencies was removed dependent.remove(); //remove the listeners from all of the dependencies dependencies.forEach(dependency => { console.log('before removing: '+dependency.listeners('removed').length); dependency.removeListener('removed',handler); console.log('after removing: '+dependency.listeners('removed').length); }); } //should remove the dependent object dependencies[0].emit("removed"); //should not do anything anymore since the listeners are removed dependencies[1].emit("removed"); 

       

网上收集的解决方案 "删除处理程序本身的事件处理程序"

你不能用bind来完成这个工作,但是你可以通过使用闭包来直接完成这个工作,或者直接绑定函数,或者在你自己的类似于bind的帮助函数中。 这很简单

 const handler = (e) => this.onDependencyRemoved(dependentItem, dependencies, handler, e); 

不过,我不确定为什么这两个function是任何东西的方法; 他们看起来相当静态。 使它们成为dependentItem方法可能是有意义的,在这种情况下,参数甚至整个handler都不需要存储在闭包variables中,而是可以使得实例属性在构造函数中被初始化。

有更好的方法来解决别人提到的问题。 但是,这个代码有一个更基本的问题:

 var bound = foo.bind(this,bound); 

你的代码在执行时bound的值是undefined 。 这相当于只是调用foo.bind(this) ,这可能不是你想要的。