异步函数返回正确的值,但链接时该值未定义

问题描述 投票:0回答:2

我对异步/等待有点陌生。如果不进行链接,我可以使代码正常工作,但是我试图使所有内容尽可能模块化。 readFiles()根据日志返回正确的值,但是“文件”日志返回未定义。没有任何中断,但是saveRecords()中的最终值是“未定义”。

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);
})();
javascript node.js async-await
2个回答
0
投票

您的readFiles在forEach之后需要有一个返回值,里面的返回值是用于数组元素的,您需要另外一个返回结果。而且我不确定您的过滤器是否可以使用,如果不需要,您应该只使用

return (afterJan16 && isActive && moreThan2000)

0
投票

将您的退货放入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);
  }
© www.soinside.com 2019 - 2024. All rights reserved.