gpt4 book ai didi

javascript - Node.js 模块是单例吗?

转载 作者:行者123 更新时间:2023-11-30 06:12:50 24 4
gpt4 key购买 nike

我以前是这样实现单例的:

class MySomething {
constructor(props) {}
}

let myInstance = null;
module.exports = (props) => {
//first time call
if(props) {
myInstance = new MySomething (props);
return myInstance;
} else {
return myInstance;
}

这假设在 app.js(入口文件)我会先调用:

require('./MySomething')(props)

然后在我使用的项目中的任何地方:

const instanceOfSomething = require('./MySomething')();

我发现每次我得到一个新实例时!

我的代码有什么问题?

我也这样试过:

class MySomething {...}

const mySomething = (function() {

let myInstance = null;

return {

init: function() {
myInstance = new MySomething();
},

getInstance: function() {
return myInstance ;
}
}

})();

module.exports = mySomething;

我在从不同的文件导入这个模块时遇到了一些问题,谁能给我解释一下?

文件的每个需求都会创建 mySomething 的新实例

更新

我现在尝试了这个例子:

class MySomething {...}

const mySomething = {
myInstance: null,
init: function() {
myInstance = new MySomething();
},
getInstance: function() {
return myInstance ;
}
}

};

module.exports = mySomething;

出现了同样的问题,可能和我的项目结构有关,这里说明一下:

下面的代码属于“facts”模块

facts 文件夹包含一个名为“dao”的文件夹,此文件夹包含 MySomething.js(单例)在 facts/index.js 中我有:

  const Localstorage = require('./dao/MySomething');

exports.init = (path) => {
Localstorage.init(path)

}
exports.Localstorage = Localstorage;

现在在一个名为“core”的文件夹中,其中包含“facts”文件夹,我在“index.js”中再次导出 Localstorage,如下所示:

 const facstModule = require('./facts');

exports.Localstorage = facstModule.Localstorage;

然后在包含“Runtime.js”的“schedule”文件夹中我写:

const { Localstorage } = require('../core');


setTimeout(() => {
const localstorageIns = Localstorage.getInstance(); //this is always null!
}, 5000)

在 app.js 文件(入口点)中我做了:

const facts =  require('./src/facts');
facts.init(__dirname);

通常会在超时执行回调之前创建实例,但是我注意到有两个 Localstorage 实例是单例的

最佳答案

最简洁的单例方式是

class MyClass () { ... }

module.exports = new MyClass()

如果你需要一个实例化一次的单例,我会这样做:

class MyClass () { ... }

let myClass
const MyClassSingleton = (...args) => {
if (myClass) {
return myClass
}
myClass = new MyClass(...args)
return myClass
}

module.exports = MyClassSingleton

关于javascript - Node.js 模块是单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57887343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com