gpt4 book ai didi

javascript - 删除处理程序本身中的事件处理程序

转载 作者:数据小太阳 更新时间:2023-10-29 04:30:42 31 4
gpt4 key购买 nike

简而言之:我想将 .bind 的结果绑定(bind)为它自己调用中的参数

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

因为我不确定还有什么方法可以解决我的问题。

问题:

我有一个项目依赖于其他项目的数组。删除其中一项后,我想删除依赖项,并删除放置在依赖项上的所有监听器

我正在努力删除其他依赖项的事件处理程序。我正在尝试使用绑定(bind),但由于处理函数是删除监听器的函数,我发现我必须将 bind() 调用的结果绑定(bind)到它自己的调用中争论。这当然行不通。

下面的绑定(bind)调用将未绑定(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);
});
}

编辑:

在 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)的函数,或者在你自己的类似于 bind 的辅助函数中。就这么简单

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

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

关于javascript - 删除处理程序本身中的事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46563691/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com