Почему «fs» сохраняет изменения файлов только после завершения программы? - PullRequest
0 голосов
/ 31 марта 2019

У меня есть приложение, которое сохраняет свое состояние на диске, когда происходит любое изменение состояния, оно считывает из файла старое состояние, оно изменяет состояние в памяти и снова сохраняется на диске.Но проблема в том, что функция 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, я действительно надеюсь, что система не будет проблемой.

...