【问题标题】:NodeJs Csv parser async operationsNodeJs Csv 解析器异步操作
【发布时间】:2021-12-10 20:39:31
【问题描述】:

我正在尝试读取一个 csv 文件,为 csv 上的每条记录获取数据并执行一些操作,最后(在所有异步操作完成后)编写一个新的 csv 文件,代码如下:

async function readInputCsv() {

  results = [];
  fs.createReadStream('./example_short.csv')
.pipe(csv())
.on('data', async function(data){
        console.log("trying for name: ", data.username);
        let edu = await getLastEducation(data.username);
        results.push({
          name: data.username,
          level: edu
        })
        console.log(data.username,": ", edu)
}).on("end", () => {
  console.log("end ! ");
  writeCsv(results);

});
}

发生的事情是“结束!”在 getLastEducation 函数返回响应之前打印

【问题讨论】:

  • 很好的解决方案是在读取流关闭后开始处理数据(end)。
  • 这似乎更好,谢谢

标签: javascript node.js csv async-await


【解决方案1】:

fs.createReadStream().on() 不接受 Promises 作为第二个参数。

on(event: string, listener: (...args: any[]) => void): this;

【讨论】:

  • 我应该做的是有一个替代的异步/等待语法可以完成这个
  • fs得到结果后可能会处理数据
【解决方案2】:

首先results 在这种情况下是一个全局变量。我建议你使用let关键字在函数范围内声明它。

在这种情况下发生的情况是 getLastEducation() 用于异步操作的时间超过了 example_short.csv 文件所需的时间。

为避免这种情况,请在fs.createReadStream() 之前添加await 关键字,并在整个读取操作之后移动writeCsv() 函数(我假设您在此函数中使用csv-writer)。 await 关键字将使其等待异步获取操作完成。

async function readInputCsv() {
  let results = [];

  await fs
    .createReadStream('./example_short.csv')
    .pipe(csv())
    .on('data', async function (data) {
      console.log('trying for name: ', data.username);
      let edu = await getLastEducation(data.username);
      results.push({
        name: data.username,
        level: edu,
      });
      console.log(data.username, ': ', edu);
    })
    .on('end', () => {
      console.log('end ! ');
    });

  writeCsv(results);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2017-09-15
    • 2023-03-16
    相关资源
    最近更新 更多