2017-06-01 13 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は、Googleの検索結果に基づいて、メモリが変数によって参照されなくなったときに自動的にメモリを解放するはずです。だから、私は新しい空の配列に配列を設定します。

my_array = []; 

しかし、私は昔の配列内のオブジェクトのすべてのevent listenersはまだeventsに応答していることを知って驚きました。

イベントリスナーと空きメモリを持つすべてのオブジェクトを削除(または間接参照)するにはどうすればよいですか?

答えて

2

あなただけが配列を消去しています。あなたのコードにバグがあるかもしれませんが、あなたが投稿したコードからは分かりません。確かに、あなたはあなたのmy_arraysオブジェクトを反復処理すると

のremoveListener(「EVENT_NAME」、イベントリスナー)ごとに、

を呼び出す必要があり、その後、明確なmy_arraymy_array = []を使用。そのようにして、参照がないので、Garbage Collectorがそれらの世話をします。最初の引数はイベント名で、2番目は削除する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] } 

すべてのイベントリスナが削除されます。

また、これが役立つ場合は、この回答を受け入れることを忘れないでください。