在node.js(readline)中逐行读取数据,但对象在完成后始终为空

时间:2018-01-15 18:47:42

标签: javascript node.js readline

我是Node.js的总菜鸟(但我已经成为21年的开发者了,fwiw)。我正在尝试编写一个小应用程序,它将读取csv文件并将其解析为一个对象。这是代码:

var getFile = (filename) => {

var columns = [],
    x = 0,
    linereader = readline.createInterface({
        input: fs.createReadStream('./import/' + filename)
    });

linereader.on('line', function (line) {
    columns[x] = {};
    columns[x].data = line.split("|");
    x++;
}).on('close', () => {
    return columns;
});

};

它可以正常工作,直到返回对象columns,这通过调试器完美创建。但是,一旦在linereader部分之外,它就是空的。

我几分钟前尝试添加.on("close")部分,即使我将columns传入其中也没有任何区别。

这件事是异步的吗?我怎样才能让它返回我的对象​​?谢谢!

1 个答案:

答案 0 :(得分:2)

节点JS是异步的,这意味着你必须等到文件读取操作完成然后使用columns变量,这样你就不能在行执行后立即返回列,甚至在.on("close")中也不能将callback函数作为参数传递给您的函数,并在callback准备就绪时运行columns

var getFile = (filename, callback) => {
    var columns = [],
        x = 0,
        linereader = readline.createInterface({
            input: fs.createReadStream('./import/' + filename)
        });

    linereader.on('line', function (line) {
        columns[x] = {};
        columns[x].data = line.split("|");
        x++;
    }).on('close', () => {
        callback(columns);
    });
};

// usage
getFile("path/to/file", (columns) => {
    console.log(columns.length)
})