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

时间:2015-11-13 09:27:09

标签: javascript node.js

我对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

我写了这个剧本:

my.js

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的人来说,以下问题可能很容易。

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

如何加强my.js以填充global.myarray而不是将其留空?

1 个答案:

答案 0 :(得分:4)

由于它的异步性,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并显示一些数据。