地图对象在执行函数后不设置值

Map object not setting values after execution of function

我在下面有一个函数,目的是解析多个本地 csv 文件。对于每个解析的 csv 文件,我然后抓取 1-5 个随机元素。由于 CSV 解析器以嵌套数组结构 ([['a'], ['b'], ['c']]) 输出数据,我进一步处理数据并提取单个数组元素以推入 final 数组。

我的最终目标是通过传入每个键的相应数组来更新 types 映射中的值

let health = createHealthData();
console.log(health, 'final output')

function createHealthData() {
  let types = new Map();
  types.set('allergies', '');
  types.set('medications', '')
  let start = 1;
  let limit = 5;

  for (let key of types.keys()) {
    let randNum = Math.floor(Math.random() * (limit - start + 1) + start); // Generates random numbers between start and limit
    let file = fs.createReadStream(path.resolve(__dirname, `${key}.csv`))

    Papa.parse(file, {
      header: false,
      complete: (results) => {
        let first = []
        let data = results.data;

        let final = [];
        for (let i = 1; i <= randNum; i++) {
          first.push(data[Math.floor(Math.random() * data.length)])
        }

        first.forEach((x) => {
          x.forEach((y) => {
            final.push(y)
          })
        })
        types.set(key, final);
        console.log(types);
      }
    })
  }
  return types;
}

我的函数可以很好地解析和处理 csv 文件,但是一旦我 return types 地图

它拒绝更新地图中的现有键

例如,我在 console.log(types) 的输出为我:

Map(2) {
   allergies => ['Banana Allergy'],
   medications => ['Opana ER', 'Atrovent HFA']
}

这就是我打算传递给函数的内容。

然而,函数执行完毕后查看health变量,输出为:

Map(2) {'allergies' => '', 'medications' => ''} final output

就好像 types.set(key,final) 行从未在函数末尾执行过。我正在努力寻找这个错误的来源,并且根据函数中 types 变量的范围,我没有看到它可能被覆盖的地方。

看起来 Papa.parse 是异步的: https://www.papaparse.com/docs

"Doesn't return anything. Results are provided asynchronously to a callback function."

由于你在最后 return types,由于执行的异步性质(即 return 类型首先发生,然后是解析完成回调,你将无法获得正确的值).

有一个类似的问题描述了不同的处理方式 Papa.parse:How to use Promises with PapaParse?

据我了解 return 函数无需等待 Papa.parse 回调,因此请尝试 How to use Promises with PapaParse? 的解决方案以等待完整的回调完成,然后 return 类型