javascript - ES6 中的单例不持久化实例
问题描述
这很接近,但是,它会在每次调用此模块时一遍又一遍地创建实例,因为我认为该变量每次都在一个新的函数构造函数中:
export const DB = () => {
const dbInstance;
function getInstance() {
if (!dbInstance) {
const db = newDb();
db.public.none(fs.readFileSync('src/DB/migrations/001-initial.sql', 'utf8'));
dbInstance = db;
}
return dbInstance;
}
return {
getInstance,
};
};
export default DB;
我搬出dbInstance
去了,它可以工作,但是感觉很脏,因为我知道dbInstance
它没有被封装并且仍然可供消费者使用,他们仍然可以导入它:
let dbInstance;
export const DB = () => {
function getInstance() {
if (!dbInstance) {
const db = newDb();
db.public.none(fs.readFileSync('src/DB/migrations/001-initial.sql', 'utf8'));
dbInstance = db;
}
return dbInstance;
}
return {
getInstance,
};
};
export default DB;
那么,我将如何正确地执行第一个示例,并在没有我的黑客攻击的情况下修复它,基本上?
解决方案
ES6 模块,就像 CommonJS 模块一样,是单例的。因此,在 ES6 中实现单例的最简单和正确的方法是:
const db = newDb();
db.public.none(fs.readFileSync('src/DB/migrations/001-initial.sql', 'utf8'));
export default db;
推荐阅读
- php - 动态多级下拉菜单php sql
- python - 获取张量元素为 int
- linux - 如何在 autotools 中使用 devtoolset
- javascript - 对数组对象中的数组项进行计数(组合计数)
- c# - 为什么我会使用 NLog 获得 FormatException?
- php - Paypal Instant Payment Notification 需要将付款人订单与付款匹配
- python - 理解谷歌的 HTML
- postgresql - 自动执行程序
- python-3.x - 如何使用驻留在前一个函数中的另一个函数来更改函数中的变量?
- php - 如何将数据从数据数组保存到变量