变量会自动重置为NodeJS脚本中的初始值吗?

时间:2016-03-02 19:47:52

标签: javascript node.js variables scope

在我开始拔头发之前,我想我应该首先寻求帮助:

我正在尝试从文件中读取数据(逐行)并计算每行中前两个字符出现的频率。结果应该写入文本文件。

如果一行以**开头,则会增加一个计数器(recordCount)并打印到控制台。它确实打印增加数字到控制台。但是,如果我在lineReader.on()块下面访问此变量或其他变量,则它们都具有初始值。这怎么可能?

"use strict";

// ...

function processFile(filePath, outFile) {
    let inFile = fs.createReadStream(filePath).pipe(new bomstrip());

    let lineReader = readline.createInterface({
        input: inFile
    });
    let tagCounts = {};
    let recordCount = 0;

    lineReader.on("line", function(line) {
        let tag = line.slice(0, 2);
        tag.trim();
        if (!tag) {
            return;
        }
        else if (tag == "**") {
            recordCount++;
            console.log(recordCount); // prints increasing numbers to console
        } else {
            let val = tagCounts[tag];
            if (val === undefined) {
                tagCounts[tag] = 1;
            } else {
                tagCounts[tag]++;
            }
        }
    });

    console.log(recordCount); // prints 0, but why?!

   // ...
}

我在Windows 8.1 64位上使用Node v5.7.0。我也尝试了var而不是let,但结果相同。

1 个答案:

答案 0 :(得分:1)

您仍然可以使用您的代码,但您需要进行一些调整。如果要打印总计数,则必须等到整个文件读取完成。你可以通过听the 'close' event来做到这一点。

这段代码可能就是您之后的代码:

"use strict";

// ...

function processFile(filePath, outFile) {
    let inFile = fs.createReadStream(filePath).pipe(new bomstrip());

    let lineReader = readline.createInterface({
        input: inFile
    });
    let tagCounts = {};
    let recordCount = 0;

    lineReader.on("line", function(line) {
        let tag = line.slice(0, 2);
        tag.trim();
        if (!tag) {
            return;
        } else if (tag == "**") {
            recordCount++;
            console.log(recordCount); // prints increasing numbers to console
        } else {
            let val = tagCounts[tag];
            if (val === undefined) {
                tagCounts[tag] = 1;
            } else {
                tagCounts[tag]++;
            }
        }
    });

    lineReader.on("close", function() {
        console.log(recordCount); // prints 0, but why?!
    });

    // ...
}