【问题标题】:Array is empty after readline data is pushed推送readline数据后数组为空
【发布时间】:2017-08-16 08:27:57
【问题描述】:

我正在尝试编写一个程序,我需要同步地从文件中逐行读取数据,并使用Array.push() 将值逐行存储在数组中。我正在使用readline npm 包读取文件。但是,当我在遍历整个文件后尝试调用数组时,它会显示一个空数组。

var fs = require('fs'),
    readline = require('readline'),
    stream = require('stream');

var instream = fs.createReadStream('sample.txt');
var outstream = new stream;
outstream.readable = true;
outstream.writable = true;
function printArray(ArrayVar){
    console.log(ArrayVar);
    }
function AddText(InputStream){
    var Text = new Array;
    var rl = readline.createInterface({
        input: instream,
        output: outstream,
        terminal: false
    });
    rl.on('line',function(line){
        Text.push(line);
    });
    return Text;
    }

var a = AddText(instream);
printArray(a);

我认为由于此代码的异步执行,我遇到了问题。如何解决这个问题并按照文本文件中的正确顺序打印数组的内容?

【问题讨论】:

    标签: javascript arrays node.js asynchronous readline


    【解决方案1】:

    在记录变量(在您的情况下为Text)值之前,您必须等待读取行。 您必须等待通过侦听close 事件来读取所有行,或者在line 事件本身中执行某些操作。

    您的代码应如下所示

        var fs = require('fs'),
         readline = require('readline'),
         stream = require('stream');
    
        var instream = fs.createReadStream('sample.txt');
        var outstream = new stream;
        outstream.readable = true;
        outstream.writable = true;
    
        function printArray(ArrayVar){
            console.log(ArrayVar);
            }
    
        function AddText(InputStream){
            var Text = new Array;
            var rl = readline.createInterface({
                input: instream,
                output: outstream,
                terminal: false
            });
    
            rl.on('line',function(line){
                Text.push(line);
            });
    
            rl.on('close', function(){
                printArray(Text)
            })
            }
    
        var a = AddText(instream);
    

    另外,您没有使用要传递给AddText 函数的参数InputStream

    【讨论】:

    • 那么如何在回调之外使用Text 变量。如在,我不能在活动之外归还它吗?我尝试将 Text 分配给全局变量,但我无法做到。
    • 当您尝试打印变量时,该值应该存在于其中。在你的情况下,你得到它是空的,因为rl.onreadline 接口发出的事件,它仅在读取一行后才会发出。您必须以某种方式等待变量被填充,或者从rl.on('close'...) 中调用一个函数(如回调函数)来实现您的逻辑。
    • @dan 也是第一个正确回答的人。所以如果你要接受答案,应该是dan's。
    • 谢谢@Panther :)
    【解决方案2】:

    您需要监听close 事件,然后打印数组。读取所有行后将调用close

    rl.on('close', function() {
       console.log(Text)
    });
    

    还有,

    var Text = new Array;

    应该是:

    var Text = new Array();

    var Text = [];

    【讨论】:

    • 我刚注意到初始化。有什么方法可以在回调之外使用Text 变量吗?就像,我无法将其分配给任何其他变量。比如创建一个全局变量MainArray 并在该回调中写入MainArray = Text。怎样才能做到这种时尚?
    • 如果我明白你的意思,那么你可以移动 var Text = new Array();在 AddText() 函数之外,这将使它可以在 AddText() 之外访问。您仍然必须使用“关闭”事件来让其他函数知道它何时被填充。
    猜你喜欢
    • 2019-06-13
    • 2021-10-13
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2021-11-12
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多