简而言之:我想将 .bind 的结果绑定为它自己的调用中的参数
var bound = foo.bind(this,bound);
因为我不确定如何解决我的问题。
问题:
我有一个依赖于一系列其他项目的项目。 删除其中一个项目后,我想删除依赖项,并删除放置在依赖项上的所有侦听器。
我正在努力删除其他依赖项的事件处理程序。我正在尝试使用 bind,但由于处理程序函数是删除侦听器的函数,我发现我必须将bind()
调用的结果绑定到它自己的调用中作为参数。这当然行不通。
下面的绑定调用将未绑定版本的"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);
然而,我不确定为什么这两个函数是任何东西的方法;它们看起来相当静态。将它们作为dependentItem
的方法可能是有意义的,在这种情况下,参数甚至整个handler
不需要存储在闭包变量中,而是可以成为要在构造函数中初始化的实例属性。
有其他人提到的更好的方法来解决你的问题。但是,代码还有一个更根本的问题:
var bound = foo.bind(this,bound);
在执行时,代码中bound
的值为undefined
。这相当于只是调用foo.bind(this)
这可能不是您想要的。