在Node.js中显示具有延迟的文件行

kdfy810k  于 2022-11-22  发布在  Node.js
关注(0)|答案(2)|浏览(135)

我尝试在node.js中编写一个程序,它逐行读取文本文件,并以2秒的延迟显示每一行。

var fs = require('fs'),
readline = require('readline');

var FileSystem_Lectura=function()
{
  this._rd=null;
}

FileSystem_Lectura.prototype.abrirArchivoCSV=function(nombreArchivo)
{
    this._rd = readline.createInterface
    ({
        input: fs.createReadStream(nombreArchivo),
        output: process.stdout,
        terminal: false
    });
}

FileSystem_Lectura.prototype.leerArchivoCSV=function()
{
    self=this;
    this._rd.on('line',self.mostraLineasDelay);
} 

FileSystem_Lectura.prototype.mostraLineasDelay=function(linea)
{
    setTimeout(self.mostraLinea,20000,linea);
}

FileSystem_Lectura.prototype.mostraLinea=function(linea)
{
    console.log("Linea:"+ linea);
}

var FS =new FileSystem_Lectura();
FS.abrirArchivoCSV(process.argv[2]);
FS.leerArchivoCSV();

问题是settimeout显示了所有的行,它没有应用延迟。除了第一行。那么,我怎样才能使它正常工作呢?
自已非常感谢

yjghlzjz

yjghlzjz1#

在您的串流上使用暂停/继续:

var fs = require('fs'),
readline = require('readline');

var FileSystem_Lectura=function()
{
  this._rd=null;
}

FileSystem_Lectura.prototype.abrirArchivoCSV=function(nombreArchivo)
{
    this._rd = readline.createInterface
    ({
        input: fs.createReadStream(nombreArchivo),
        output: process.stdout,
        terminal: false
    });
}

FileSystem_Lectura.prototype.leerArchivoCSV=function()
{
    self=this;
    this._rd.on('line',self.mostraLineasDelay);
} 

FileSystem_Lectura.prototype.mostraLineasDelay=function(linea)
{
    this._rd.pause();
    setTimeout(self.mostraLinea,2000,linea);
}

FileSystem_Lectura.prototype.mostraLinea=function(linea)
{
    console.log("Linea:"+ linea);
    this._rd.resume();
}

另外,2秒是2000毫秒,而不是20000毫秒。

unftdfkk

unftdfkk2#

现在这种事情容易多了:

import {createInterface} from 'readline';
import {createReadStream} from 'fs';
import {pipe, delay} from 'iter-ops';

const file = createInterface(createReadStream('./my-file.txt'));

const i = pipe(file, delay(2000)); //=> AsyncIterable<string>

(async function () {
    for await(const line of i) {
        console.log(line); // prints line-by-line, with 2s delays
    }
})();

readlinefs现在是标准的。iter-ops是一个额外的模块。

相关问题