删除所有事件发射器侦听器,最近的除外
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()
.
期间被调用之前被克隆
寻找一种方法来删除除最近添加的侦听器之外的所有侦听器。
所以对于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()
.