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

Remove all event emitter listeners, except most recent

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

所以对于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');
}

但我认为您需要传入一个函数。有什么解决办法吗?

您可以通过 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().

期间被调用之前被克隆