gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:35:22 25 4
gpt4 key购买 nike

我正在使用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
});
}

所有对象都是从类/库创建的。所有对象都有事件监听器

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

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

my_array = [];

但是,我惊讶地发现旧数组中对象的所有事件监听器仍然响应事件

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

最佳答案

您只是清除数组。您的代码中可能存在错误,无法从您发布的代码中看出。可以肯定的是,您应该迭代 my_arrays 对象并调用

removeListener (‘event_name’, eventListener)

对于每个,然后使用 my_array = [] 清除 my_array。这样,垃圾收集器就会处理这些,因为不会有任何引用。第一个参数是事件名称,第二个参数是要删除的事件监听器。

此外,根据您的情况,您应该使用

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

最后,所有事件监听器都被删除。

关于javascript - Node.js 如何删除具有事件监听器的对象并释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com