2017-06-01 66 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] } 

在結束所有事件偵聽器都將被刪除。

此外,如果這可以幫助你,請記住接受這個答案。