希望找到一种方法来删除除最近添加的侦听器之外的所有侦听器。
因此对于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');
}
但我认为你需要传递一个函数。有什么方法吗?
答案 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()
期间调用任何事件名称之前,会克隆事件名称的侦听器。