简而言之:我想将.bind的结果绑定为它自己调用时的参数。
var bound = foo.bind(this,bound);
因为我不确定如何解决我的问题。
问题:
我有一个依赖于其他项目数组的项目。 当其中一个项目被移除时,我希望移除依赖项目,并移除所有放置在依赖项上的监听器。
我正在努力删除其他依赖项的事件处理程序。我尝试使用bind,但由于处理程序函数是删除侦听器的函数,因此我发现我必须将bind()调用的结果绑定到它自己的调用作为参数中。这当然是行不通的。
下面的绑定调用将未绑定版本的“handler”绑定为参数,因此removeEventListener无法正常工作,因为它是函数的不同副本。
问题是:我可以使用bind来做到这一点吗?或者我该如何解决这个问题?
我使用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");