【问题标题】:Synchronous processing of a csv file using fast-csv使用 fast-csv 同步处理 csv 文件
【发布时间】:2016-07-14 10:03:03
【问题描述】:

我正在尝试使用 fast-csv 处理 csv 文件,这是我的代码。

    var stream = fs.createReadStream("sample.csv");
    csv.fromStream(stream, {headers : true})
    .on("data", function(data) {
            console.log('here');
            module.exports.saveData(data, callback)
        })
    .on("end", function(){
        console.log('end of saving file');
    });

    module.exports.saveData = function(data) {
    console.log('inside saving')
    }

我面临的问题是过程不同步。 我看到的输出类似于

这里
这里
内部储蓄
里面保存

但是,我想要的是

这里
内部储蓄
这里
里面保存

我假设我们需要使用 async.series 或 async.eachSeries 但不完全确定如何在这里使用它。非常感谢任何输入

提前致谢!

【问题讨论】:

  • 所以要等saveDate完成后再继续解析下一行CSV数据?
  • 是的。没错

标签: node.js csv


【解决方案1】:

您可以暂停解析器,等待saveData 完成,然后恢复解析器:

var parser = csv.fromStream(stream, {headers : true}).on("data", function(data) {
  console.log('here');
  parser.pause();
  module.exports.saveData(data, function(err) {
    // TODO: handle error
    parser.resume();
  });
}).on("end", function(){
  console.log('end of saving file');
});

module.exports.saveData = function(data, callback) {
  console.log('inside saving')
  // Simulate an asynchronous operation:
  process.setImmediate(callback);
}

【讨论】:

  • 哇,这正是我需要的。谢谢!
  • @robertklep : 我们可以在 on-data 中调用任何 promise 吗?
  • @AmitPanwar 应该是可能的,只要您在 承诺已解决/拒绝之后调用 parser.resume()
  • 我在 then 子句中调用 parser.resume() 但它没有进入承诺,我已经添加了正在跳过的控制台
  • @vikaskv saveData 已经异步执行。但是,当最后一个 data 事件已生成或最后一个 data 事件处理程序返回时,有可能(甚至可能)生成 end 事件。这不会考虑事件处理程序内部的任何异步调用。您需要为此创建一个解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多