删除处理程序本身的事件处理程序
简而言之:我想在自己的调用中将绑定的结果作为一个争论
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)
,这可能不是你想要的。