使用常规函数绑定到事件时,我可以毫无问题地删除它。但是当使用动态的上下文函数列表时,我无法删除这些函数的监听器。
这是整个测试应用程序的简化版本:
'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;
}
这将导致:
Warning: Possible EventEmitter memory leak detected. 11 error listeners added.
Use emitter.setMaxListeners() to increase limit
因为对removeListener
的调用并未真正删除侦听器。
如何删除那样的动态侦听器?
答案 0 :(得分: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;
}
它会做你想要的。