2016-11-16 2 views
1

가장 최근에 추가 된 리스너를 제외한 모든 리스너를 제거하는 방법을 찾고자합니다. 가장 최근의 것을 제외한 모든 이벤트 이미 터 수신기를 제거합니다.

그래서 process.stdin을 위해, 우리는 내가 콜백 A와 B를 제거 할

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

할 수 있지만, C를두고 있습니다. 내가 A 또는 B에 대한 참조가없는이 경우 그러나

는, 내가 좋아하는 뭔가를하고 싶지 :

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

을하지만 난 당신이 함수를 전달할 필요가 있다고 생각이 주위에 어떤 방법을. ?

+1

리스너를 제거하려면 추가 할 때 사용한 함수를 전달해야합니다. 그리고 함수가 필요하므로 익명의 함수가 될 수 없습니다.이 함수는 공통 범위에서 선언 된 명명 된 함수 여야하므로 추가 될 때와 동일한 참조를 제거해야합니다. – jfriend00

+0

당신이 맞습니다. 이상한 것 같아요 removeListener ('event-name') 함수를 두 번째 인수로 호출하면 배열에서 가장 오래된 수신기를 팝하지 않을 것입니다 –

+0

이상한가요? 나는 그렇게 생각하지 않는다. 그것은 코딩 무결성 문제입니다. 함수에 대한 참조가 없으면 리스너를 제거 할 수 없습니다. 에미 터는 자신의 코드 내에서뿐만 아니라 외부 코드를 포함한 많은 곳에서 사용하도록 설계되었습니다. 리스너 참조를 저장하는'.on()'에 대한 오버 라이드를 래핑하여 원하는대로 핸들러를 제거 할 수 있습니다. 그리 어렵지 않습니다. – jfriend00

답변

1

eventEmitter.listeners()을 통해 특정 이벤트에 대한 핸들러 사본을 검색 할 수 있습니다. 그러나, 당신은 진짜로 특정한 순서에있는 그 (것)들에 의지하면 안된다. 같은 대신 fn.name에 당신이 할 수있는, 대신 지점

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

을 유지하려는 하나 개의 함수의 이름을 알고있는 경우 :

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

현재 작동하는 하나 개의 솔루션입니다

또 하나주의해야 할 점은 'readable' 이벤트 핸들러에서이 리스너를 제거하면 다른 리스너가 계속 해당 이벤트 (이후 이벤트는 아님)에 대해 호출된다는 것입니다. .emit() 중에 이벤트 이름의 리스너가 호출되기 전에 이벤트 이름의 리스너가 복제되기 때문입니다.

관련 문제