Как я могу инициализировать статическую переменную в module.exports = class в node.js.
По сути, я пытаюсь добиться того, что если StaticVariable равно нулю, я получу данные из файла json. Затем сохраните его в StaticVariable.
module.exports = class Config {
static fetch() {
if ( StaticVariable === null ) {
const fs = require('fs');
const data = fs.readFileSync('./config.json');
const config = JSON.parse(data);
StaticVariable = config;
}
return StaticVariable;
}
}
Функция fetch() будет вызываться несколько раз, поэтому нет необходимости выполнять readFileSync каждый вызов.
Я сделал fetch() статичным, потому что не хочу new Config. @эстус
Это не объясняет, зачем вам нужен класс. Является ли fetch единственным участником?
Если вы спрашиваете, является ли выборка единственной функцией, это не так. Будут new, update и т. д. и не будет статической функции. @эстус
Пожалуйста, обновите вопрос со всем соответствующим кодом и примером того, как вы используете Config. Должно быть несколько экземпляров? То, что у вас здесь, похоже, проблема XY, которую можно было бы решить лучше. Обязательно ли быть ленивым fetch? Вы можете просто сделать exports.config = require('./config.json') в верхней части модуля
Где определяется StaticVariable и как вы используете функцию fetch?
@estus Да. Я согласен, что это проблема XY, я думаю, что я просто проверю другие способы сделать это. Спасибо. :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Статический класс — это антипаттерн в JavaScript, потому что класс никогда не создается.
Если есть необходимость в методе, который лениво загружает файл JSON, можно использовать простой объект. В области модуля уже есть такой объект, module.exports:
const fs = require('fs');
let StaticVariable;
exports.fetch = () => {
if ( StaticVariable == undefined ) { // not "=== null"
const data = fs.readFileSync('./config.json');
const config = JSON.parse(data);
StaticVariable = config;
}
return StaticVariable;
}
Возможно, нет необходимости анализировать его вручную, потому что с этим можно справиться require('./config.json') в одну строку и с более согласованными относительными путями.
Если файл JSON может быть загружен с нетерпением, это можно упростить до:
exports.config = require('./config.json');
Если есть потребность в классе Config и он должен получить доступ к объекту конфигурации, он может ссылаться на него, например:
exports.Config = class Config {
constructor() {
this.config = deepClone(exports.config);
}
modify() {
// modify this.config
}
};
Я могу придумать несколько способов добиться того, о чем вы просите.
Сохранение в глобальной переменной
//initialise it here
var StaticVariable = null;
//however if you initialise it here, it makes more sense to just load it once
const fs = require('fs');
const data = fs.readFileSync('./config.json');
const config = JSON.parse(data);
StaticVariable = config;
module.exports = class Config {
static fetch() {
return StaticVariable;
}
}
Или просто используйте require. Require будет делать то же самое, что и вы. Он прочитает файл config.json, попытается проанализировать его как допустимый json и сделает это только один раз.
module.exports = class Config {
static fetch() {
return require('./config.json');
}
}
Начиная с (узел 15.2.1) ES2020 поддерживаются статические поля закрытого класса. Так что отныне статический класс не может быть анти-шаблоном, и вы можете создать экземпляр класса, используя новые ключевые слова. ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static
module.exports = class Config {
statiC#StaticVariable = null;
static fetch() {
if ( StaticVariable === null ) {
const fs = require('fs');
const data = fs.readFileSync('./config.json');
const config = JSON.parse(data);
StaticVariable = config;
}
return StaticVariable;
}
}
Где знак # означает частное, дополнительную ссылку можно найти в https://node.green, но все же самый простой способ описан в других ответах.
exports.config = require('./config.json');
Какая у вас проблема с этим кодом, кроме того, что вы не определили переменную StaticVariable? Статический класс — это антипаттерн. Является ли fetch единственным участником?