![](/img/trans.png)
[英]What does it mean to call Object.create(new EventEmitter) in Node.js
[英]In Node.js, does listening to an EventEmitter, create a reference to it?
如果我有這樣的代碼:
const EventEmitter = require('events');
class Bot extends EventEmitter {
sendMessage() {
// do something
this.emit('messageSent', 'user123');
}
}
class Controller {
loadBot() {
const bot = new Bot();
bot.on('messageSent', userId => {
// do something
});
}
}
在loadBot
內部創建的bot
對象會被立即銷毀嗎? 或者稍后通過垃圾收集?
或者Controller
的實例是否會持有對它的引用,以便在Controller
實例被銷毀之前bot
永遠不會被銷毀?
單獨注冊一個事件偵聽器並不能阻止它被垃圾收集。 有些東西實際上必須有一個對Bot
對象本身的引用(這樣事件才能真正從它發出)才能不被垃圾收集。
在您的 Controller 類中,如果沒有其他任何內容引用您創建的Bot
實例,那么它將有資格進行垃圾回收。 這是有道理的,因為如果沒有任何東西可以引用它,那么其他任何東西都不能使用它,也沒有任何東西可以調用其自定義方法sendMessage()
。
正如您現在擁有的代碼一樣,您的bot
變量只是loadBot()
方法中的一個局部變量,沒有其他任何東西可以引用它。 因此,一旦loadBot()
方法執行loadBot()
, bot
變量就可以進行垃圾回收,因為任何地方都沒有代碼可以再次使用或訪問該對象。 這使它有資格進行垃圾收集。
從您的代碼來看,您可能希望bot
變量成為Controller
對象的實例變量。 如果是這種情況,那么只要某些人引用了您的Controller
對象,那么bot
對象也會保持活動狀態。
所以,看起來你可能打算這樣做:
const EventEmitter = require('events');
class Bot extends EventEmitter {
sendMessage() {
// do something
this.emit('messageSent', 'user123');
}
}
class Controller {
loadBot() {
this.bot = new Bot();
this.bot.on('messageSent', userId => {
// do something
});
}
send() {
this.bot.sendMessage();
}
}
var c = new Controller();
c.loadBot();
在這里,您在Controller
對象的實例數據中保留了對bot
變量的引用,因此可以通過其他代碼(如send()
方法)或訪問Controller
對象上的.bot
屬性的任何其他代碼訪問它。
我不認為對象機器人會被垃圾回收,因為有一個監聽器持有對它的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.