Javascript 为什么我会有这个范围问题,我该如何解决它?
我正在尝试使用node.js环境中的“csv解析器”模块。我成功地阅读了我的csv文档,得到了一个数组“results”,其中包含了我需要的.json格式的所有信息。第一个console.log打印所有数据,但第二个打印空数组(如声明的)。为什么我会有这个范围问题,我该如何解决它?提前谢谢大家Javascript 为什么我会有这个范围问题,我该如何解决它?,javascript,arrays,promise,scope,node-modules,Javascript,Arrays,Promise,Scope,Node Modules,我正在尝试使用node.js环境中的“csv解析器”模块。我成功地阅读了我的csv文档,得到了一个数组“results”,其中包含了我需要的.json格式的所有信息。第一个console.log打印所有数据,但第二个打印空数组(如声明的)。为什么我会有这个范围问题,我该如何解决它?提前谢谢大家 const csv = require('csv-parser'); const fs = require('fs'); let results = []; fs.createReadStream('My
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
这不是范围问题,而是时间问题。您的第二个
console.log(results)
在没有任何数据之前执行
您的流和csv()
模块是非阻塞和异步的。这意味着你启动它们,它们在后台以自己的速度工作,不时地触发事件来做更多的工作。同时,代码的其余部分将继续运行。那是你最后一次
console.log(results)
在流和.pipe(csv())
完成之前运行很长时间,因此它是空的
要在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(函数(){
控制台日志(“2”);
}, 100);
控制台日志(“3”)
@VLAZ-这里不是100%匹配,因为这是从一个函数返回一个非同步值,它与这里发生的事情不完全匹配。为了进一步理解,阅读仍然很有用。