簡體   English   中英

在 Node.js 中,偵聽 EventEmitter 是否會創建對它的引用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM