確定是否需要等待process.stdout
上的drain
事件的標準建議是在寫入時檢查它是否返回false。將節點管道連接到標準輸出 - 如何判斷是否排幹?
我應該如何檢查是否已經通過管道傳輸另一個流?在所有輸出實際寫入之前,似乎該流可以發出finish
。我可以做些什麼嗎?
upstreamOfStdout.on('finish', function(){
if(!process.stdout.write('')) {
process.stdout.on('drain', function() { done("I'm done"); });
}
else {
done("I'm done");
}
});
upstreamOfStdout.pipe(process.stdout);
我更喜歡不依賴於任何流的內部的答案。只要流符合節點流接口,那麼執行此操作的規範方法是什麼?
EDIT:
較大的範圍內是一個包裝:
new Promise(function(resolve, reject){
stream.on(<some-event>, resolve);
... (perhaps something else here?)
});
其中stream
可以process.stdout
或別的東西,其具有另一個通過流管道輸送到它。
無論何時調用resolve
,我的程序都會退出 - 我認爲Promise
代碼可以讓程序保持活動狀態,直到所有的promise都被解決。
我已經多次遇到這種情況,並一直使用黑客來解決問題(例如process.stdout
中有幾個私有成員是有用的。)但是我真的想要一勞永逸地解決這個問題(或者學習它是一個錯誤,所以我可以跟蹤這個問題,並在解決問題時解決它,至少):我怎麼知道另一個下游流是否完成處理其輸入?
我遇到的問題是,如果聽不到排水,程序會在所有內容寫完之前終止,但如果我傾聽排水,它有時候不會發生。我認爲只有當數據被緩衝時纔會發出漏極,但我不知道數據是否被緩衝。他們似乎沒有書面的方式來問一個流是否完成了寫作。 – shaunc
當'write'方法返回'false'時,緩衝發生,或者至少這就是文檔所說的。因此,「排水」事件是在這種情況之後。請記住,只要您在要執行的循環中有一些有意義的內容,程序就會保持活躍狀態。你有沒有嘗試過聽第一個「end」事件,而不是最後一個? – skypjack
我相信'end'已被棄用於可寫流 - 'finish'是要聽的事件。從我的示例代碼中可以看到,我確實聽完了。關於「寫入方法返回false時發生緩衝」的說法是正確的 - 當前的問題是當由於使用管道發送數據而無法看到「寫入」返回時要執行的操作。例如,在收到上游官方批准的「finish」後寫入一個空字符串?我非常感謝維護者的迴應,或者對他們寫的東西的引用,因爲doc看起來沒有結果。 – shaunc