删除所有事件发布者侦听器,除了最新的

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

所以对于process.stdin,我们可以这样做

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

我想删除callbacka和b,但离开c。

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

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

但我认为你需要传递一个函数。

您可以通过eventEmitter.listeners()获取特定事件的处理程序副本。 但是,你真的不应该依靠他们在一个特定的顺序。

这是一个这样的解决scheme,目前的作品:

 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()期间被调用之前被克隆。