javascript-在Node.js中,是否监听EventEmitter并创建对其的引用?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-在Node.js中,是否监听EventEmitter并创建对其的引用?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1562字,纯文字阅读大概需要3分钟。
内容图文
如果我有这样的代码:
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()方法执行完毕,则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并创建对其的引用?全部内容,希望文章能够帮你解决javascript-在Node.js中,是否监听EventEmitter并创建对其的引用?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。