我正在使用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
。
如何删除(或取消引用)具有事件侦听器并释放内存的所有对象?
答案 0 :(得分:2)
您只是清除阵列。您的代码中可能存在错误,无法从您发布的代码中判断出来。当然,您应该遍历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。