У меня есть приложение, которое сохраняет свое состояние на диске, когда происходит любое изменение состояния, оно считывает из файла старое состояние, оно изменяет состояние в памяти и снова сохраняется на диске.Но проблема в том, что функция store записывает на диск только после закрытия программы.Я не знаю почему?
const load = (filePath) => {
const fileBuffer = fs.readFileSync(
filePath, "utf8"
);
return JSON.parse(fileBuffer);
}
const store = (filePath, data) => {
const contentString = JSON.stringify(data);
fs.writeFileSync(filePath, contentString);
}
Чтобы создать полный пример, давайте использовать команду load-dataset
в файле "src / interpreter / index.js".
while(this.isRunning) {
readLineSync.promptCL({
"load-dataset": async (type, name, from) => {
await loadDataset({type, name, from});
},
...
}, {
limit: null,
});
}
Как правило, это вызывает loadDatasets
, который читает json
ou csv
файлы.
export const loadDataset = async (options) => {
switch(options.type) {
case "csv":
await readCSVFile(options.from)
.then(data => {
app.createDataset(options.name, data);
});
break;
case "json":
const data = readJSONFile(options.from);
app.createDataset(options.name, data);
break;
}
}
Метод createDataset()
читает файл на диске, обновляет его и записывает снова.
createDataset(name, data) {
const state = loadState();
state.datasets = [
...state.datasets,
{name, size: data.length}
];
storeState(state);
const file = loadDataset();
file.datasets = [
...file.datasets,
{name, data}
];
storeDataset(file);
}
Где методы loadState(), storeState(), loadDataset(), storeDataset()
используют исходные методы.
const loadState = () =>
load(stateFilePath);
const storeState = state =>
store(stateFilePath, state);
...
const loadDataset = () =>
load(datasetFilePath);
const storeDataset = dataset =>
store(datasetFilePath, dataset);
Я использую пакет из npm
с именем readline-sync
для создания простого "терминала", я незнать, не вызывает ли это каких-либо конфликтов.
Исходный код находится в Github: Git repo .В файле "index.js" метод createDataset()
вызывает loadState()
и storeState()
, которые оба используют методы, показанные выше.
Пакет readline-sync
используется в интерпретаторе, здесь Файл интерпретатора , базовый цикл которого выполняется до команды выхода.
Как отмечается, я использую Ubuntu 18.04.2 и Node.js 10.15.0.Для создания этого кода я видел пример в YouTube Video .Этот парень использует MAC OS X, я действительно надеюсь, что система не будет проблемой.