有没有办法实际暂停readline?

时间:2017-01-09 21:01:39

标签: javascript node.js

考虑以下代码,输入文件和结果。 setTimeout在这里模仿外部调用,例如http get。保持结果有序的最佳/简单方法是什么?明显增加的延迟和不运行并发是可以的。 rl.pause()和rl.resume()不起作用,可能是因为它暂停了下划线输入流,或者我在这里遗漏了什么?

'use strict';

let rl = require('readline').createInterface({
    input: require('fs').createReadStream('inputFile')
});

rl.on('line', line => {
    rl.pause();
    setTimeout(_ => {
        console.log(line);
        rl.resume();
    }, Math.random() * 2000);
});

INPUTFILE:

1
2
3
4
5
6
7
8
9
10
11
12

结果:

10
6
1
11
3
7
8
9
12
2
5
4

1 个答案:

答案 0 :(得分:2)

这是readline模块在​​NodeJS中的工作方式的限制。它会暂停读取输入但不会立即执行此操作。这部分是因为节点流的设计目的。

pauseresume旨在处理背压 - 这意味着他们的目标是处理过快的生产者"为了让消费者跟上并保持节点的平衡。它们的设计绝不是为了保证事情立即停顿。

您可以使用较低级别fs操作并逐个读取行或将其存储在缓冲区中以克服此问题。如果文件足够小 - 只需在其上执行fs.readFile并按\n分割就足够了,然后使用promises迭代它并执行异步操作。