我正在尝试使用来自node.js环境的'csv-parser'模块。我成功阅读了csv文档,并获得了一个数组“结果”,其中包含我需要的所有信息(.json格式)。第一个console.log打印所有数据,而第二个console.log打印一个空数组(声明)。为什么会有这个示波器问题,我该如何解决?谢谢大家。
const csv = require('csv-parser');
const fs = require('fs');
let results = [];
fs.createReadStream('MyData.csv')
.pipe(csv())
.on('data', data => results.push(data))
.on('end', () => {
console.log(results) //1st console.log
console.log('CSV file successfully processed');
});
console.log(results);//2nd console.log
答案 0 :(得分:1)
这不是范围问题,而是时间问题。您的第二个console.log(results)
在其中没有任何数据之前正在执行。
您的流和csv()
模块是非阻塞且异步的。这意味着您可以启动它们,它们在后台会以自己的速度运行,经常触发事件以进行更多工作。同时,其余代码将继续运行。那就是你的最后一个
console.log(results)
在流和.pipe(csv())
完成之前运行LONG,因此为空。
要在node.js中使用异步操作进行编码,必须在表示事件完成的回调中使用结果。因此,您必须在第一个console.log(results)
所在的位置使用结果。
const csv = require('csv-parser');
const fs = require('fs');
let results = [];
fs.createReadStream('MyData.csv')
.pipe(csv())
.on('data', data => results.push(data))
.on('end', () => {
console.log(results) //1st console.log
console.log('CSV file successfully processed');
// use results HERE
});
// can't use results here
这是一个更简单的示例,您实际上可以在这里运行:
console.log("1");
setTimeout(function() {
console.log("2");
}, 100);
console.log("3");
此输出
1
3
2
这是因为setTimeout()
也是非阻塞且异步的。调用setTimeout()
只会启动计时器,然后其余代码继续运行。这就是3
在2
之前输出的原因。