考虑下面的代码......我试图在阅读前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. });
(我与该模块没有任何关系,只是发现它对处理这个问题很有帮助.)