javascript - 对 Node.js readline on() 方法感到困惑

标签 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 而不是留空?

最佳答案

由于 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,并显示一些数据。

关于javascript - 对 Node.js readline on() 方法感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33689501/

相关文章:

javascript - 不寻常的 if/else 行为

node.js - 为什么 momentjs-node 无法识别该时间字符串?

javascript - 网页包 2.6.2、JavaScript

javascript - 在 AngularJS 中处理转换后的数据

javascript - Google +1 按钮导致 JavaScript 错误

javascript - 模块解耦、模块间通过事件传递参数的最佳方式

使用递归的 JavaScript 斐波那契数列

javascript - 如何将 strip token 从 AngularJS 传递到 NodeJS 或修复错误 NodeJS 帖子?

node.js - JWT token 发行和 Passport w/node js

Node.js 堆快照填充了旧版本代码的字符串