将ReadStream值写入数组

时间:2018-09-20 10:46:15

标签: javascript node.js csv asynchronous nodes

我试图通过使用快速csv库使用流和async,await关键字同步读取csv。

但是,我的函数似乎未返回所需的输出。我的猜测是,我编写的函数中的函数/流花费的时间比节点考虑使用的console.log函数输出数组长度要花费的时间长。

如何返回包含从csv流读取的所有值的output数组?

// CSV Processing
async function readCsv(csvfilepath) {
    var output = []
    var stream = fs.ReadStream(csvfilepath)
    var parser = csv.fromStream(stream, {
        headers: true
    }).on("data", function (data) {
        parser.pause()
        t(data, output, function (err) {
            // TODO: handle error
            parser.resume()
        });
    }).on("end", function () {
        console.log(output) // outputs desired array with objects
        console.log(output.length) // length is 100
        // return output // does not work. output == [].
    });


    var t = (data, out, callback) => {
        out.push(data) // push the objects to that array
        callback()
    }

    console.log(output.length) // says length = 0
    return output // output is empty, should be filled with values exactly like in the 'end' event from the stream
}

1 个答案:

答案 0 :(得分:0)

我通过使用Promise对象解决了它。 resolve方法可用于返回在流的“结束”事件中处理的数据,同时仍可与async / await关键字一起使用。

// CSV Processing
function readCsv(csvfilepath) {
    var stream = fs.ReadStream(csvfilepath)
    return new Promise((resolve, reject) => {
        var output = []
        const parser = csv.fromStream(stream, {headers:true})
            .on('data', (data) => {
                parser.pause();
                c(data, output, (err) => {
                    if (err) reject(err)
                    parser.resume()
                })
            })
            .on('end', () => {
                resolve(output) // extraction/return point of the desired data
            })
        var c = (data, out, callback) => {
            out.push(data)
            callback()
        }
    })
}