2017-06-01 172 views
0

我正在使用Node.js。我有一个objects阵列。Node.js如何删除具有事件监听器并释放内存的对象?

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

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

根据谷歌搜索结果,当内存不再被任何变量引用时,Garbage Collector应该自动释放内存。所以,我的阵列设置为一个新的空数组:

my_array = []; 

不过,我很惊讶地发现,老数组中的对象的所有event listeners仍应对events

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

回答

2

你只是清理你的数组。您的代码中可能存在一个错误,无法从您发布的代码中分辨出来。可以肯定,你应该遍历您my_arrays对象,并使用my_array = []调用

的removeListener(“EVENT_NAME”,事件监听)

每个多云my_array。那样Garbage Collector会照顾那些,因为没有参考。第一个参数是事件名称,第二个参数是要删除的eventListener。

而且,你的情况,你应该使用

removeAllListeners(“EVENT_NAME”)

,因为它并不需要事件监听功能的名字,你再也不会需要这些对象后。

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] } 

在结束所有事件侦听器都将被删除。

此外,如果这可以帮助你,请记住接受这个答案。