2016-06-18 2 views
0

일반 함수를 사용하여 이벤트에 바인딩 할 때 문제없이 제거 할 수 있습니다. 그러나 컨텍스트 함수의 동적 목록을 사용하는 경우 해당 함수에 대한 리스너를 제거 할 수 없습니다. removeListener에 대한 호출 정말 리스너를 제거하지 않기 때문에동적 이벤트 수신기를 제거 할 수 없습니다.

Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit

:

'use strict'; 

var util = require('util'); 
var EventEmitter = require('events').EventEmitter; 

function CustomEventEmitter() { 
    EventEmitter.call(this); 
} 

util.inherits(CustomEventEmitter, EventEmitter); 

var obj = new CustomEventEmitter(); 

var onError, exists = false; 

for (var i = 0; i < 20; i++) { 

    onError = function (err) { 
     console.log(err, i); 
    }; 

    if (exists) { 
     obj.removeListener('error', onError); 
     exists = false; 
    } 

    obj.on('error', onError); 
    exists = true; 
} 

그것은 발생합니다 :

다음은 전체 테스트 응용 프로그램의 단순화 된 버전입니다.

어떻게 동적 청취자를 제거해야합니까?

답변

1

예! 당신이 할 때

var onError = function (err) { 
    console.log(err, i); 
}; 

onError 변수에 새로운 기능을 할당합니다. obj.on('error', onError);obj.removeListener('error', onError); 사이에 작업을 수행 했으므로 제거하려고 시도한 것과 동일하지 않습니다. 그래서 아무 것도 제거되지 않습니다.

이 작업을 수행 할 경우

'use strict'; 

var util = require('util'); 
var EventEmitter = require('events').EventEmitter; 

function CustomEventEmitter() { 
    EventEmitter.call(this); 
} 

util.inherits(CustomEventEmitter, EventEmitter); 

var obj = new CustomEventEmitter(); 

var exists = false; 
var onError; 

for (var i = 0; i < 20; i++) { 
    if (exists) { 
     obj.removeListener('error', onError); 
     exists = false; 
    } 

    onError = function (err) { 
     console.log(err, i); 
    }; 

    obj.on('error', onError); 
    exists = true; 
} 

당신이 원하는 것을 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 나의 예를 지나치게 간소화 시켰을지도 모른다. 나는 현실에서 내가하는 일을보다 정확하게 반영하기 위해이 예를 갱신했다. 역동적 인 청취자 목록을 위해이를 어떻게 해결할 수 있습니까? –

+0

신경 쓰지 마라, 나는 다른 질문을하기 때문에 그것을 되돌 렸습니다. –