javascript - 在 Node.js 中,是否监听 EventEmitter,创建对它的引用?

标签 javascript node.js memory-management garbage-collection eventemitter

如果我有这样的代码:

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 的实例是否会保留对它的引用,以便 botController 实例被销毁之前永远不会被销毁?

最佳答案

单独注册一个事件监听器并不能阻止它被垃圾收集。某些东西实际上必须有对 Bot 对象本身的引用(以便事件实际上可以从它发出)才能不被垃圾收集。

在您的 Controller 类中,如果没有任何其他对象引用您创建的 Bot 实例,那么它将有资格进行垃圾回收。这是有道理的,因为如果没有任何东西引用它,那么就没有其他东西可以使用它,也没有任何东西可以调用它的自定义方法 sendMessage()

因为您现在有了代码,所以您的 bot 变量只是 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 属性的任何其他代码。

关于javascript - 在 Node.js 中,是否监听 EventEmitter,创建对它的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38449262/

相关文章:

javascript - ChartJS - 一个元素的工具提示覆盖了用户应该能够选择的点

c++ - 分配新 vector 时的 std::bad_alloc - 我能做什么

javascript - 将大型 JSON 数据集从 REST API 转换为新的转换文件

javascript - jQuery 数据属性未设置

javascript - 错误: "ReferenceError: promise is not defined" adding promise to my code

javascript - 在 node.js (Express) 中分配给 res 和 res.locals 的区别

javascript - 如何进行 Monkeypatch Express View 查找?

c# - 使用 block 从内部返回一次性对象

c++ - 简单的内存问题练习

javascript - 使用输入类型打印年-月-日的日期