无法删除动态事件侦听器

时间:2016-06-18 19:13:31

标签: node.js eventemitter

使用常规函数绑定到事件时,我可以毫无问题地删除它。但是当使用动态的上下文函数列表时,我无法删除这些函数的监听器。

这是整个测试应用程序的简化版本:

'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的调用并未真正删除侦听器。

如何删除那样的动态侦听器?

1 个答案:

答案 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;
}

它会做你想要的。