为什么我的全局数组索引在我需要时未定义?

why is my global array index undefined when I need it?

我有以下代码用于打开一个文件,逐行读取它,并将每一行推送到一个数组。在将它推送到数组之前,我能够 console.log 该行,所以我知道它在那个阶段具有作为一行的值。但是在那之后我无法 console.log 它作为数组的元素。我认为这与范围有关,但我不明白为什么它根本不起作用 - 它只是记录为 "undefined".

var fs = require ("fs");

var lines = [];

function readLines(input, func)
{
    var remaining = '';

    input.on('data', function(data)
    {
        remaining +=data;

        var index = remaining.indexOf('\n');

        while(index > -1)
        {
            var line = remaining.substring(0, index);
            remaining = remaining.substring(index + 1);

            func(line);

            index = remaining.indexOf('\n');
        }
    });

    input.on('end', function()
    {
        if(remaining.length > 0)
        {
            func(remaining);
        }
    });
}

function func(data)
{
    console.log ("line : " + data);
    lines.push(data);
}

var input = fs.createReadStream('testing.csv');
readLines(input, func);

console.log(lines[0]);

您可能想在函数完成后进行检查 - 它是异步的,因此您的 console.log(lines[0]) 将在读取数据之前执行(很可能)

尝试添加:

input.on('end', function(){
    if(remaining.length > 0)
    {
        func(remaining);
    }
    console.log(lines[0]);
}

里面readLines()

嗯,这与 javascript 的异步性质有关。

您正在创建读取流

fs.createReadStream('testing.csv');

然后,您正在监听它的事件:

input.on('data', function(data)
input.on('end', function()

但是,这些事件中的内容会在触发时执行。

在你的代码中你有:

var input = fs.createReadStream('testing.csv');
readLines(input, func);

// You are trying to access the line at position zero, 
// when it might not been set yet, 
// since the events might have not been triggered yet.
console.log(lines[0]);

您将需要确保在 readLines 完成后使用这些行尝试在 readLines 函数之外设置结束侦听器,如下所示:

var input = fs.createReadStream('testing.csv');
readLines(input, func);

//console.log(lines[0]);

input.on('end', function(){
    console.log(lines[0]);
});

Javascript 是另一种野兽,它有自己的习惯用法和编程范例,您可能想阅读有关如何更好地构建代码以适应其异步性质的最佳实践.