删除处理程序本身的事件处理程序

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)

Ber*_*rgi 7

你不能这样做bind,但你可以通过使用一个闭包来做到这一点 - 或者直接用于绑定函数,或者你自己的辅助函数类似bind.这很简单

const handler = (e) => this.onDependencyRemoved(dependentItem, dependencies, handler, e);
Run Code Online (Sandbox Code Playgroud)

我不确定为什么这两个函数都是任何方法; 他们看起来很静止.这可能有意义,使他们的方法dependentItem,在这种情况下,争论乃至handler不需要存放在封闭的变量,但可以由在构造函数中被初始化实例属性.


Guy*_*yse 6

有更好的方法来解决别人提到的问题.但是,代码存在一个更基本的问题:

var bound = foo.bind(this,bound);
Run Code Online (Sandbox Code Playgroud)

bound代码中的值,在执行时,是undefined.这相当于只是调用foo.bind(this)可能不是你想要的.