考虑以下代码,输入文件和结果。 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
答案 0 :(得分:2)
这是readline
模块在NodeJS中的工作方式的限制。它会暂停读取输入但不会立即执行此操作。这部分是因为节点流的设计目的。
pause
和resume
旨在处理背压 - 这意味着他们的目标是处理过快的生产者"为了让消费者跟上并保持节点的平衡。它们的设计绝不是为了保证事情立即停顿。
您可以使用较低级别fs
操作并逐个读取行或将其存储在缓冲区中以克服此问题。如果文件足够小 - 只需在其上执行fs.readFile
并按\n
分割就足够了,然后使用promises迭代它并执行异步操作。