为什么会有这个示波器问题,我该如何解决?

时间:2019-11-17 00:53:39

标签: javascript arrays promise scope node-modules

我正在尝试使用来自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

1 个答案:

答案 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()只会启动计时器,然后其余代码继续运行。这就是32之前输出的原因。