繁体   English   中英

Node.js如何删除具有事件侦听器并释放内存的对象?

[英]Node.js How to delete an object which has event listener and free up memory?

我正在使用Node.js 我有一系列的objects

var my_array = [];
var param_array = [xx, xx, ...];

for (i = 0; i < 5; i++) {
    my_array[i] = new ClassName(param[i]);

    (my_array[i]).on('event_name', function() {
        // do something
    });
}

所有对象都是从类/库创建的。 所有的对象都有event listener

使用完数组中的对象后,我想删除所有对象并释放内存。

根据Google搜索结果,当内存不再被任何变量引用时, Garbage Collector应自动释放内存。 因此,我将数组设置为新的空数组:

my_array = [];

但是,我很惊讶地发现旧数组中对象的所有event listeners器仍在响应events

如何删除(或取消引用)所有具有事件侦听器并释放内存的对象?

您只清除阵列。 您的代码中可能存在错误,无法从您发布的代码中分辨出来。 可以肯定的是,您应该遍历my_arrays对象并调用

removeListener('event_name',eventListener)

对于每个,然后使用my_array = []清除my_array 这样,由于没有参考文献,垃圾收集器将负责处理这些问题。 第一个参数是事件名称,第二个是您要删除的eventListener。

另外,在这种情况下,您应该使用

removeAllListeners('event_name')

因为它不需要eventListener函数名称,并且以后也不需要这些对象。

SSCCE:

//creating an EventEmitter object just to illustrate how it works
var events = require('events');

function ExampleObject() {
  events.EventEmitter.call(this);

  this.talk = function()
  {
      this.emit('event_name');
  }
}

ExampleObject.prototype.__proto__ = events.EventEmitter.prototype;

var exampleObject = new ExampleObject();

exampleObject.on('event_name', function() {
    console.log('Here I go!');
  });

exampleObject.talk();
//---------
my_array = [];

var listener = function listener()
{
  console.log('event_name_listener');
}


for(i = 0; i < 5; i++)
{
    my_array[i] = new events.EventEmitter();
    my_array[i].on('event_name', listener);
}

for(i = 0; i < my_array.length; i++)
{
    my_array[i].emit('event_name');
    console.log(i);
}

for(i = 0; i < my_array.length; i++)
{
    my_array[i].removeAllListeners('event_name'); //could use removeListener('event_name', listener)
}

my_array = [];
console.log("Array length:"+my_array.length);


//------------- and here our ExampleObject
exampleObject.talk();
console.log("Listeners: "+require('util').inspect(exampleObject.listeners('event_name')));

console.log(exampleObject);//more info

exampleObject.removeAllListeners('event_name');
exampleObject.talk();//nothing happens

console.log("Listeners: "+require('util').inspect(exampleObject.listeners('event_name')));

delete exampleObject;
console.log(exampleObject);

输出:

Here I go!
event_name_listener
0
event_name_listener
1
event_name_listener
2
event_name_listener
3
event_name_listener
4
Array length:0
Here I go!
Listeners: [ [Function] ]
ExampleObject {
  domain: null,
  _events: { event_name: [Function] },
  _eventsCount: 1,
  _maxListeners: undefined,
  talk: [Function] }
Listeners: []
ExampleObject {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  talk: [Function] }

最后,将删除所有eventListeners。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM