Javascript 单例不能跨多个文件节点工作

Javascript 单例不能跨多个文件节点工作,javascript,node.js,events,singleton,Javascript,Node.js,Events,Singleton,我尝试创建一个事件发射器的单例实例,如下所示 在文件mediator.js中 const {EventEmitter} = require('events') class MyEmitter extends EventEmitter { constructor() { super(); this.test = Math.random() } } class Singleton { getInstance() { cons

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

在文件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个实例中的测试属性不同)

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


提前谢谢

我看不出您创建singleton的方式有任何问题。我试过这个,效果也不错。当我需要两个文件时,它给了我相同的实例


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

您的示例完全正确,并且您的单例工作正常。您如何要求这些test\u mediator\u 1.js和这些test\u mediator\u 2.js?2文件test\u mediator\u 1.js和test\u mediator\u 2.js中的2个实例是不同的。因此,当我在文件test\u mediator\u 1中侦听事件时:``media.on('test',(data)=>console.log(data))`,在文件mediator\u 2.js中,我会发出一个事件:``mediator.emit('test','hello')``该事件不会在文件mediator\u 1.js中触发。但是,当我在文件mediator_1.js中发出一个事件时,我仍然重新激活了该事件。您是否在两个对象中获得了相同的test属性值??是..相同的值。您如何要求这两个文件?谢谢,我发现了一个错误,即我将两个文件test_mediator_1.js和test_mediator_2.js作为两个单独的程序运行。我需要在发出之前运行listener。
MyEmitter {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  test: 0.9233626983577679,
  [Symbol(kCapture)]: false
}