【问题标题】:How to read multiple csv files in node.js如何在 node.js 中读取多个 csv 文件
【发布时间】:2015-08-23 10:48:52
【问题描述】:

我正在尝试读取多个 csv 文件,然后将它们作为属性添加到对象中,但是 node.js 的异步确实阻止了我这样做。

这是我试过的代码。

var Converter=require("csvtojson").core.Converter; 
var fs = require('fs');
var csvConverter=new Converter();
var data = {};

for (var i = 0; i < 10; i++)
{   
    var csvFileName="./data/String(i)".csv";

    csvConverter.on("end_parsed",function(jsonObj){
    data['file'+String(i)] = json;


    //read from file
    fs.createReadStream(csvFileName).pipe(csvConverter);
});

}

这导致了可怕的混乱,因为 for 循环在任何事件被触发之前就结束了。我真的更喜欢同步解决方案,但我知道 node.js 根本不是为此而构建的。

因此,如果有人可以帮助我了解如何解决此异步问题,我会很高兴。然而,这是我第一次遇到这样的问题。一个小时前我还不知道异步代码的概念。

【问题讨论】:

  • 您的示例中有很多错误/格式问题,应予以清理,以消除对问题根源的任何混淆。我提交了修改以更正它们。
  • 学习使用承诺。 Bluebird 是一个很棒的 Promise 库,可以让你的部分代码同步

标签: javascript node.js file csv asynchronous


【解决方案1】:

i 存在问题,因为您无法预测 end_parsed 回调函数中的内容,因此请尝试:

var fileIndex = 0;
csvConverter.on('end_parsed', function (json) {
    data['file' + fileIndex] = json;
    if (fileIndex === 9) {
       // It is done, call the callback to finish processing
       callback(data);
    }
    fileIndex += 1;
});

var callback = function (data) {
    // Put callback code here
    console.log(data.file0);
};

真正解决这个问题的最好方法是使用Promises

【讨论】:

  • 'end parsed' 事件如何知道i
  • 只要它在for 循环内,它就知道i。实际上 JavaScript 是函数作用域的,所以内部函数可以访问所有外部函数的变量
  • 我的经验是,forloop 在任何“结束解析”事件之前很久就完成了,所以i 没有用。
  • 我不明白这个。我不熟悉回调函数。你能写出具体的代码吗?
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2011-11-05
相关资源
最近更新 更多