删除所有事件发射器侦听器,但最近除外

时间:2016-11-16 04:43:45

标签: node.js events eventemitter

希望找到一种方法来删除除最近添加的侦听器之外的所有侦听器。

因此对于process.stdin,我们可能会这样做

process.stdin.on('readable',function a(){});
process.stdin.on('readable',function b(){});
process.stdin.on('readable',function c(){});

我想删除回调a和b,但请留下c。

但是,在这种情况下,我没有对a或b的引用,我想做类似的事情:

while(process.stdin.listenerCount('readable') > 1){
   process.stdin.removeListener('readable');
}

但我认为你需要传递一个函数。有什么方法吗?

1 个答案:

答案 0 :(得分:1)

您可以通过eventEmitter.listeners()检索特定活动的处理程序副本。但是,你真的不应该依赖它们按照特定的顺序。

以下是目前有效的解决方案之一:

process.stdin.listeners('readable').forEach(function(fn) {
  if (process.stdin.listenerCount('readable') > 1)
    process.stdin.removeListener('readable', fn);
});

如果您知道要保留的一个功能的名称,那么您可以改为仅在fn.name分支,例如:

process.stdin.listeners('readable').forEach(function(fn) {
  if (fn.name !== 'c')
    process.stdin.removeListener('readable', fn);
});

还要注意的一件事是,如果从'readable'事件处理程序中删除这些侦听器,则仍会为该特定事件(但不是将来的事件)调用其他侦听器。这是因为在.emit()期间调用任何事件名称之前,会克隆事件名称的侦听器。