2017-01-09 124 views
1

考虑下面的代码,输入文件和结果。 setTimeout在这里模仿外部呼叫,例如http get。保持结果有序的最佳/简单方法是什么?显而易见的附加延迟并没有运行并发是好的。 rl.pause()和rl.resume()并没有这样做,可能是因为它暂停了下划线输入流,或者我在这里丢失了某些东西?有没有一种方法可以实际暂停readline?

'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 

回答

2

这是的readline模块中如何的NodeJS工作的限制。它暂停阅读输入,但不立即执行。部分原因是由于节点流设计的目的。

pauseresume是为了处理背压 - 这意味着他们的目标是处理生产者,他们的消费者为了平衡节点而“过快”。他们从来没有在保证立即停顿的情况下设计。

您可以使用较低级别的fs操作,并逐一读取这些行或将它们存储在缓冲区中以解决此问题。如果文件足够小 - 只需执行fs.readFile,然后按\n进行拆分就可能足以使用承诺迭代它并执行异步操作。

+0

换句话说:不,谢谢。 – niry

+0

@ niry几乎 - 是的。 –

相关问题