暂停Node.js中的readline

 mobiledu2502897157 发布于 2023-01-31 15:07

考虑下面的代码......我试图在阅读前5行后暂停流:

var fs          = require('fs');
var readline    = require('readline');
var stream      = require('stream');
var numlines    = 0;
var instream    = fs.createReadStream("myfile.json");
var outstream   = new stream;
var readStream = readline.createInterface(instream, outstream);
readStream.on('line', function(line){
  numlines++;
  console.log("Read " + numlines + " lines");
  if (numlines >= 5) {
    console.log("Pausing stream");
    readStream.pause();
  }
});

输出(下一个复制)表明它在暂停后继续读取行.也许readline已经在缓冲区排队了几行,无论如何都要把它们送给我......如果它继续在后台异步读取会有意义,但根据文档,我不知道是什么应该是正确的行为.有关如何达到预期效果的任何建议?

Read 1 lines
Read 2 lines
Read 3 lines
Read 4 lines
Read 5 lines
Pausing stream
Read 6 lines
Pausing stream
Read 7 lines

Alexander O'.. 16

有点不直观,暂停方法不会停止排队的事件:

调用rl.pause()不会立即暂停实例'line'发出的其他事件(包括)readline.Interface.

然而,有一个名为第三方模块line-by-line,其中pause 确实暂停line事件,直到它被恢复.

var LineByLineReader = require('line-by-line'),
    lr = new LineByLineReader('big_file.txt');

lr.on('error', function (err) {
  // 'err' contains error object
});

lr.on('line', function (line) {
  // pause emitting of lines...
  lr.pause();

  // ...do your asynchronous line processing..
  setTimeout(function () {

      // ...and continue emitting lines.
      lr.resume();
  }, 100);
});

lr.on('end', function () {
  // All lines are read, file is closed now.
});

(我与该模块没有任何关系,只是发现它对处理这个问题很有帮助.)

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有