Функция asyn c возвращает правильное значение, но это значение не определено при сцеплении - PullRequest
1 голос
/ 02 марта 2020

Я немного новичок в async / await. Я могу заставить свой код работать, если не цепочки, но я стараюсь сделать все как можно более модульным. readFiles() возвращает правильное значение в соответствии с журналом, но журнал "файлы" возвращает неопределенное значение. Ничего не нарушается, но конечное значение из saveRecords() равно "undefined".

const fs = require("fs");
const {
  convertCurrencyStr,
  getFiles,
  getMsFromDate,
  parseJSON
} = require("./utils");

const saveResults = data => {
  const writePath = path.join(__dirname, "filteredRecords.json");
  try {
    fs.writeFileSync(writePath, JSON.stringify(data));
  } catch (err) {
    console.log("Could not write data.", err);
  }
};

const filterRecords = data => {
  console.log("filtered", data);
  const deltaDateMs = getMsFromDate("January 1, 2016");
  try {
    const results = data.filter(item => {
      const registeredDateMs = getMsFromDate(item.registered);
      const afterJan16 = registeredDateMs > deltaDateMs;
      const isActive = item.isActive === true;
      const moreThan2000 = convertCurrencyStr(item.balance) > 2000;
      if (afterJan16 && isActive && moreThan2000) {
        return true;
      }
    });
    return results;
  } catch (err) {
    "No data available.", err;
  }
};

const readFiles = async () => {
  const directoryPath = path.join(__dirname, "data");
  try {
    const files = await getFiles(directoryPath);
    files.forEach(file => {
      const filePath = path.join(directoryPath, file);
      const data = fs.readFileSync(filePath);
      const results = parseJSON(data);
      return results;
    });
  } catch (err) {
    console.log("Could not read files.", err);
  }
};

(async () => {
  const files = await readFiles();
  const records = await filterRecords(files);
  saveResults(records);
})();

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Оставьте свой возврат за пределами forEach

try {
    const files = await getFiles(directoryPath);
    let results;
    files.forEach(file => {
      const filePath = path.join(directoryPath, file);
      const data = fs.readFileSync(filePath);
      results = parseJSON(data);
    });
    return results;
  } catch (err) {
    console.log("Could not read files.", err);
  }
0 голосов
/ 02 марта 2020

Ваши readFiles должны иметь возврат после forEach, возврат внутри для элемента массива, вам нужен еще один, чтобы вернуть результаты. И я не уверен, что ваш фильтр будет работать, если он не нужен, вы должны использовать только

return (afterJan16 && isActive && moreThan2000)
...