我试图通过使用快速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
}
答案 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()
}
})
}