2017-01-09 126 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幾乎 - 是的。 –

相關問題