javascript - createReadStream end 在数据完成处理之前触发

标签 javascript node.js csv stream fs

我正在尝试执行以下操作:

  • 逐行流式传输 csv 文件。
  • 修改每一行中包含的数据。
  • 流式传输和处理所有行后,完成并继续执行下一个任务。

  • 问题是.on("end").on("data") 之前发生火灾完成处理每一行。我怎样才能得到.on("end").on("data") 之后开火是否已完成所有线的处理?

    下面是我所说的一个简单的例子:
    import parse from 'csv-parse'; 
    
    var parser = parse({});
    
    fs.createReadStream(this.upload.location)
    .pipe(parser)
    .on("data", line => {
      var num = Math.floor((Math.random() * 100) + 1);
      num = num % 3;
      num = num * 1000;
      setTimeout( () => { 
        console.log('data process complete');
      }, num);
    })
    .on("end", () => {
       console.log('Done: parseFile');
       next(null);
    });
    

    提前致谢。

    最佳答案

    我认为问题在于 setTimeout 事件监听器中的 data (或任何其他异步任务)。 enddata 之后触发,但即使在流触发 end 之后,异步任务也会导致它记录消息。
    如果您取出 setTimeout ,那么您会看到它在 end 之前将所有消息记录在 data 中。您仍然可以执行异步任务,但可能会有一批在流结束后运行。
    此代码有助于解释发生了什么:

    const fs = require('fs')
    
    const testFileName = 'testfile.txt'
    
    fs.writeFileSync(testFileName, '123456789')
    
    let count = 0
    const readStream = fs.createReadStream(testFileName, {
      encoding: 'utf8',
      highWaterMark: 1  // low highWaterMark so we can have more chunks to observe
    })
    readStream.on('data', (data) => {
      console.log('+++++++++++processing sync+++++++++++++')
      console.log(data)
      console.log('+++++++++++end processing sync+++++++++++++')
      setTimeout(() => {
        console.log('-----------processing async-------------')
        console.log(data)
        console.log('-----------end processing async-------------')
      }, ++count * 1000)
    })
    readStream.on('end', () => {
      console.log('stream ended but still have async tasks doing their thing')
      fs.unlinkSync(testFileName)
    })
    

    关于javascript - createReadStream end 在数据完成处理之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36345549/

    相关文章:

    javascript - jquery如何调用另一个函数的 'end'中的函数?

    javascript - 跳过 Photoshop 脚本中的对话框?

    javascript - Express.js 请求隔离

    javascript - 需要指导将 excel 修改为 JSON javascript 代码,以便每组数据输出一个 JSON

    javascript - 使用 Headless Chrome/Puppeteer 无法登录 Google

    c# - 将动态 Dapper 结果序列化为 CSV

    python - 获取 Pandas read_csv() 读入的 dtypes 字典

    Javascript 缓慢的异步操作

    node.js - 查找 MongoDb 架构设计的查询

    r - 加载多个包含逗号或句点作为小数点的 `csv` 文件