坚持使用node.js Readline模块

时间:2017-05-30 19:12:08

标签: javascript node.js readline

我正处于Node.js和JavaScript的入门级,我想逐行读取txt文件,并按照调整的时间间隔打印每一行,我发现这个模块帮助我读取了行#34 ; https://nodejs.org/api/readline.html" 。 但我的代码一次发布所有行,我想在行之间等待几秒钟 我添加了setTimeout函数并尝试了很多没有vail的配置。谢谢

     const readline = require('readline');
     const fs = require('fs');
  const rl = readline.createInterface({
  input: fs.createReadStream(process.cwd() +'/sample.txt')  
 });

 rl.on('line', function(input){
  rl.pause();
  console.log(input);

   setTimeout(() => {
     rl.resume();
    }, 5000);

2 个答案:

答案 0 :(得分:0)

此解决方案使用队列。每次读取一行时,它都会被添加到一个队列中,该队列每5秒就会消耗一行。

const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
    input: fs.createReadStream(process.cwd() + '/sample.txt')
});

var queue = [];

setInterval(function () {
    if (queue.length > 0) {
        var item == queue.shift();
        console.log(item);
    }
}, 5000);

rl.on('line', function(input) {
    queue.push(input);
});

如果您的队列变得非常大,您可以暂停,并在长度较低时再次恢复。

答案 1 :(得分:0)

使用同步执行程序nsynjs可以轻松完成此操作:

var nsynjs = require('nsynjs');

// following 2 files can be found in nsynjs package
var textFile = require('./wrappers/nodeReadline').textFile;
var wait = require('./wrappers/nsynWait').nsynWait;

function process(textFile,wait) {
    var fh = new textFile();
    fh.open('../data/lorem.txt');
    var s, i = 0;
    while (typeof(s = fh.readLine(nsynjsCtx).data) != 'undefined')
    {
        if(s)
            console.log(s);
        else
            console.log("<empty line>");
        wait(nsynjsCtx,1000);
    }
    fh.close();
}

var ctx = nsynjs.run(process,{},textFile,wait,function () {
    console.log('done');
});

可以在此处找到完整的工作示例:https://github.com/amaksr/nsynjs/blob/master/examples/node-readline/index.js