NodeJS的 按行读取(readline)模块,某种情况下,无法终止读取?(close方法不生效)

黑夜的风
  • 59

1、场景

我想读取一个 txt 。取到某一行特定字符的时候,终止读取。代码如下:

// 引入模块
const readline = require('readline');
const fs = require('fs');
const stream = fs.createReadStream('./txt/测试文本.txt');
const rl = readline.createInterface({
    input: stream,
});

// 定义变量
let singer_msg_list = [];

// 开始读取
rl.on('line', (line) => {
    `aaaaaaaaaaaaaa`
    if(line.indexOf('<name>') !== -1){
        // 添加这一行。
        singer_msg_list.push(line);
    }else{
        // 程序结束
        rl.close()
    }

})
.on('close', () => {
    console.log("读取到的值:" + singer_msg_list);
});

运行之后。文本正确输出,rl.close()触发,程序结束。

但我发现,如果在 aaaaaaaaa 处添加

console.log("这一行是:"+line);

那么。程序调用之后,Node会继续读取下面的文本行!close()触发了,但程序没有结束。
(会读到最后一行才结束)

2、参考文档

http://nodejs.cn/api/readline...
Node 文档中提到:

rl.close() 方法会关闭 readline.Interface 实例,并放弃对 input 和 output 流的控制。
当调用时,将触发 'close' 事件。
调用 rl.close() 不会立即停止 readline.Interface 实例触发的其他事件(包括 'line')。

这几句我没看懂。
为什么加上 console.log() 就会导致 line事件 继续触发呢?
我尝试结束 createReadStream的流、调用fs.close(),均不能关闭。

stream.destroy()
stream.close(); 
stream.push(null)
stream.read(0);

fs.close(rl, (err) => {
    if (err) throw err;
});

(参考了:http://nodejs.cn/api/fs.html#...
https://stackoverflow.com/que...
望解疑。

评论
阅读 696
1 个回答

你自己都看到了文档说的很清楚

调用 rl.close() 不会立即停止 readline.Interface 实例触发的其他事件(包括 'line')。

不会立即停止line事件,表示调用rl.close后line事件还会继续出发的,和你加不加上 console.log()没有关系的,不行你在rl.close之前打个日志就知道了

宣传栏