2013-05-21 3 views
1

익명 함수로 래핑 된 명명 된 콜백 함수에서 전달 된 리스너를 제거하는 방법이 있습니까?익명 함수로 래핑 된 명명 된 콜백을 제거 하시겠습니까?

업데이트. 아래의보다 완벽한 코드 예제.

여기에 자세한 내용이 나와 있습니다. 명명 된 콜백으로 전달되는 함수가 있습니다.

function read (message, named_callback) { 

    var named_callback = named_callback || default_callback 
     , message  = message || "Choose: "; 

    stdout.write(message); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 
    stdin.on('data', named_callback); 
    }); 
}; 

하기 전에 모든 named_callback들 가지고와 사용자 입력 (답) 전달 준비합니다.

answer = answer.trim().toLowerCase(); 

결국 모든 곳에서 트리밍과 줄 바꾸기가 반복됩니다. 이 단계를 한 곳으로 옮기고 자 콜백에 들어가기 전에 대답을 준비하려고했습니다.

function read (message, named_callback) { 

    var named_callback = named_callback || default_callback 
     , message  = message || "Choose: "; 

    stdout.write(message); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 
    stdin.on('data', function (answer) { 
     answer = answer.trim().toLowerCase(); 
     named_callback(answer); 
    }); 
}; 

후 그러나이 제거되지 않는 이벤트 리스너 결과, 프로그램이 너무 많은 청취자와 충돌 할 때까지 그들은 단지 쌓아 : 나는이 썼다.

감사합니다.

답변

2

문제는 아마 당신이 생각하는 곳이 아닙니다. 당신이주는 정보는 매번 read 메소드를 호출 할 것을 기대할 것이고, tomanylisteners가 들어갈 곳은 언제나 새로운 '데이터'리스너를 추가하기 때문입니다. 당신은 '에서'응용 프로그램 야해 충돌 '한 번'이상에 있음을 변경하는 경우 : 당신의 문제에 대한 해결책 밤은 물론

stdin.once('data'... 

이, 그것이 문제가 (이 아니 트림 /와 toLowerCase이고 단지 설명하기 .

당신은 어쩌면 우리가 더 나은 당신을 도울 수 있지만, 아마 당신의 읽기 방법은 단지 불필요한 오버 헤드가 코드의 좀 더로 표시하면 ... 답변

+0

감사합니다. 그래서 코드를 업데이트 예, 그것이 있었기 때문에 래핑 함수가 아무런 가치를 추가하지 않은 것처럼 보였습니다. '한번'문제를 해결할 수 있다고 생각합니다. 코드를 다시 작성하려고합니다. ck. 그 동안 청취자를 추적하고 제거하는 다른 방법이 있는지 알고 있습니까? –

+0

@ hearandnow78'once' 메소드가 내 문제를 해결했습니다. 제안 해 주셔서 감사합니다. –

관련 문제