我有一個EventEmitter
對象,我設置爲收聽事件。發生事件時,我想將信息寫入文件。我有一個開放的FileStream
通過fs.createWriteStream(path, { flags: 'a'});
目前,我的問題是,如果我發出事件超快,經常,我開始得到「備份」。 IE .write
返回false
要求我停止寫一會兒。由於我在事件處理程序中進行寫操作,因此附近沒有用於指示寫入過程結束的回調函數。我可以從處理或排放方面做什麼來防止備份?從事件處理程序寫入WriteStream
最終,它似乎並不重要;所有的數據都被寫入文件。但我希望儘可能遵循「規則」。
我知道我可以聽drain
事件並在此後再次開始寫,但是如何防止其他事件進入處理程序?我注意到,如果我在每次發射之前放置了50毫秒的延遲,備份似乎不會發生,但似乎有點像黑客。另外如果你有一個較慢的硬盤?
下面是我的情況爲例:
var ee = new EventEmitter();
var stream = fs.createWriteStream('./file/log.txt', { flags:'a'});
ee.on('report', function (i) {
stream.write('new file data ' + i + ' --- ' + Date.now + '\n');
});
for (var i = 0; i < 10000; ++i) {
ee.emit('report', i)
}
這不是確切的代碼,但是這是它的要點。完整的代碼發生在從正在運行的HTTP服務器發送響應時,但如果我像1000個請求一樣排隊,通過for循環,我就會遇到上述情況。
您應該重命名您的變量以匹配您的函數調用。 Ex readStream實際上是一個writeStream,因爲這是您創建的內容,並且您推送到可讀流而不是writeStream,然後從可讀流傳輸到可寫流。如果你修復它,我會刪除我的投票並用一個投票取代它。 – esnm 2015-04-12 14:08:30
我不認爲真的需要downvote,但代碼存在實際問題,所以我解決了這個問題。 – arb 2015-04-13 13:28:23
Upvoted它。你的命名混亂和誤導。現在看起來好多了。謝謝。 – esnm 2015-04-14 15:00:34