Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我会有这个范围问题,我该如何解决它?_Javascript_Arrays_Promise_Scope_Node Modules - Fatal编程技术网

Javascript 为什么我会有这个范围问题,我该如何解决它?

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

我正在尝试使用node.js环境中的“csv解析器”模块。我成功地阅读了我的csv文档,得到了一个数组“results”,其中包含了我需要的.json格式的所有信息。第一个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

这不是范围问题,而是时间问题。您的第二个
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%匹配,因为这是从一个函数返回一个非同步值,它与这里发生的事情不完全匹配。为了进一步理解,阅读仍然很有用。