【问题标题】:Why am I having this scope problem and how can I fix it? [duplicate]为什么我有这个范围问题,我该如何解决? [复制]
【发布时间】:2020-03-12 18:15:56
【问题描述】:

我正在尝试使用 node.js 环境中的“csv-parser”模块。我成功阅读了我的 csv 文档,并得到了一个数组“结果”,其中包含我需要的所有 .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

【问题讨论】:

  • @VLAZ - 这不是 100% 匹配,因为这是关于从函数返回一个异步值,这与这里发生的事情不完全匹配。对进一步理解仍然有用。

标签: javascript arrays promise scope node-modules


【解决方案1】:

这不是范围问题,而是时间问题。您的第二个 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(function() {
    console.log("2");
}, 100);

console.log("3");

这个输出

1
3
2

那是因为setTimeout() 也是非阻塞和异步的。调用setTimeout() 只是启动计时器,然后其余代码继续运行。这就是为什么32 之前输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2020-03-25
    相关资源
    最近更新 更多