Fli*_*ion 7 javascript function event-handling node.js
简而言之:我想将.bind的结果绑定为它自己的调用中的争论
var bound = foo.bind(this,bound);
Run Code Online (Sandbox Code Playgroud)
因为我不确定如何解决我的问题.
问题:
我有一个项目依赖于其他项目的数组.删除其中一个项后,我想删除依赖项,并删除依赖项上的所有侦听器.
我正在努力删除其他依赖项的事件处理程序.我正在尝试使用bind,但由于处理函数是删除侦听器的函数,我发现我必须将bind()调用的结果作为参数绑定在它自己的调用中.这样做不起作用.
下面的绑定调用将"处理程序"的未绑定版本绑定为参数,因此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);
});
}
Run Code Online (Sandbox Code Playgroud)
编辑:
完成在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");
Run Code Online (Sandbox Code Playgroud)
你不能这样做bind,但你可以通过使用一个闭包来做到这一点 - 或者直接用于绑定函数,或者你自己的辅助函数类似bind.这很简单
const handler = (e) => this.onDependencyRemoved(dependentItem, dependencies, handler, e);
Run Code Online (Sandbox Code Playgroud)
我不确定为什么这两个函数都是任何方法; 他们看起来很静止.这可能有意义,使他们的方法dependentItem,在这种情况下,争论乃至handler不需要存放在封闭的变量,但可以由在构造函数中被初始化实例属性.
有更好的方法来解决别人提到的问题.但是,代码存在一个更基本的问题:
var bound = foo.bind(this,bound);
Run Code Online (Sandbox Code Playgroud)
bound代码中的值,在执行时,是undefined.这相当于只是调用foo.bind(this)可能不是你想要的.