【问题标题】:Singleton not work across mutiple file Nodejs单例不能跨多个文件Nodejs工作
【发布时间】:2020-03-09 12:17:11
【问题描述】:

我尝试创建一个事件发射器的单例实例,如下所示

在文件 mediator.js 中

const {EventEmitter} = require('events')

class MyEmitter extends EventEmitter {
    constructor() {
        super();
        this.test = Math.random()
    }
}

class Singleton {
    getInstance() {
        console.log(Singleton.instance)
        if (!Singleton.instance) {
            Singleton.instance = new MyEmitter()
        }
        return Singleton.instance
    }
}


module.exports = Singleton


在文件 test_mediator_1.js 中,我创建了一个实例

const MyEmitter = require('./mediator')
const mediator = new MyEmitter().getInstance()
console.log(mediator)

我得到了一个实例。

MyEmitter {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  test: 0.255542039674032,
  [Symbol(kCapture)]: false
}

但是,在 test_mediator_2.js 中:

const MyEmitter = require('./mediator')
const mediator = new MyEmitter().getInstance()
console.log(mediator)

我得到了一个不同的实例(2 个实例中的测试属性不同)

MyEmitter {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  test: 0.9233626983577679,
  [Symbol(kCapture)]: false
}

如何跨多个文件获取单例实例???

提前致谢!!

【问题讨论】:

  • 你的例子完全没问题,你的单例工作正常。您如何需要这些 test_mediator_1.js 和这些 test_mediator_2.js?
  • 2个文件test_mediator_1.js和test_mediator_2.js中的2个实例不一样。因此,当我在文件 test_mediator_1 上监听事件时:``` media.on('test', (data) => console.log(data)) ``` 在文件 mediator_2.js 中,我发出一个事件:`` ` mediator.emit('test', 'hello') ``` 在 mediator_1.js 文件中没有触发事件。但是,当我在 mediator_1.js 文件中发出事件时,我仍然收到了该事件。

标签: javascript node.js events singleton


【解决方案1】:

我认为您创建单例的方式没有任何问题。我试过了,它也工作得很好。当我需要两个文件时,它给了我相同的实例。

另外,关于发射事件,您需要确保在注册侦听器后需要发射事件。如果您首先运行具有发出部分的文件,则数据将被发出,并且由于没有侦听器,它将丢失。我想这就是你的情况。确保顺序正确。

【讨论】:

  • 你是否在 2 个对象中得到相同的测试属性值??
  • 是的..相同的值。你怎么需要你的两个文件?
  • 谢谢,我发现我将两个文件 test_mediator_1.js 和 test_mediator_2.js 作为两个单独的程序运行的错误。而且我需要在发射之前运行监听器。
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 2014-05-09
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2021-04-17
  • 2019-03-12
  • 1970-01-01
相关资源
最近更新 更多