被Node.js readline on()方法混淆

我对从readline on()方法中看到的一些简单行为感到困惑。

我有一个名为的文件small.csv,看起来像这样:

Date,Close

2015-11-12,2045.97

2015-11-11,2075.00

2015-11-10,2081.72

2015-11-09,2078.58

我写了这个脚本:

var rl = require('readline').createInterface({

input: require('fs').createReadStream('small.csv')

});

global.myarray = [];

rl.on('line', function (line) {

console.log('Line from file:', line);

global.myarray.push(line);

});

console.log(global.myarray);

// done

脚本输出:

dan@nia111:~/d1d2p $ 

dan@nia111:~/d1d2p $ node -v

v5.0.0

dan@nia111:~/d1d2p $

dan@nia111:~/d1d2p $

dan@nia111:~/d1d2p $ node my.js

[]

Line from file: Date,Close

Line from file: 2015-11-12,2045.97

Line from file: 2015-11-11,2075.00

Line from file: 2015-11-10,2081.72

Line from file: 2015-11-09,2078.58

dan@nia111:~/d1d2p $

dan@nia111:~/d1d2p $

我想增强脚本,使其充满global.myarray而不是空着。

当我使用逐步浏览脚本时node-debug,似乎global.myarray正在填充,但我认为这是一种幻想。

另外,当我运行 node my.js 时, console.log(global.myarray);

small.csv读取之前运行。

因此,我可能需要在这里了解一些异步机制。

对于那些了解readline得很好的人,以下问题可能很容易。

但是,我很乐意得到这个问题的答案:

回答:

由于它具有异步特性,Node.js在这种情况下可能会有些棘手。这意味着当您的代码正在执行时,它将触发rl.on('line')处理程序并传递到下一个调用(在我们的情况下为)console.log。实际代码中的问题不是数组未填满,而是您希望将其填充到早期。这是如何解决问题的示例:

var rl = require('readline').createInterface({

input: require('fs').createReadStream('small.csv')

});

global.myarray = [];

rl.on('line', function (line) {

console.log('Line from file:', line);

global.myarray.push(line);

});

rl.on('close', function () {

console.log(global.myarray);

});

在这段代码中,当不再需要读取任何行时,console.log将调用,并且将显示一些数据。

以上是 被Node.js readline on()方法混淆 的全部内容, 来源链接: utcz.com/qa/411322.html

回到顶部