2017-04-04 108 views
0

我想通過擴展stream.Readable來實現可讀流。超類流的問題。複雜的

根據文檔,我所要做的就是實現_read()。

我不明白的是在_read中如何處理沒有數據的數據,或者一旦我再次獲取數據時如何觸發另一個_read調用。在Readable中我沒有看到一個概念來處理緩慢或延遲傳遞的數據。我可以看到_read()在調用pipe()函數後立即被調用。

如果在_read任何時候,我都沒有數據我有不提供返回,似乎_read永遠不會再次調用。一旦數據準備就緒,我嘗試發出可讀的事件,但不會觸發對_read的調用。

這個問題並不僅僅發生在啓動,但每當我需要源的交付時間可能會發生。 Stream.Readable不支持緩慢的來源嗎?

回答

1

_read()僅僅是一個信號,讓你知道更多的數據可以/應該從上游源讀取。這個問題最重要,當你push()數據流和push()返回false。當發生這種情況時,您應該再次調用_read()之前不要再推送任何數據。

沒有什麼能阻止你隨時推送任何數量的數據,但如果你沒有檢查push()的返回值並相應地採取行動,那麼你最終可能會在內存中緩衝太多的數據。

此外繼承/子類Readable的時候,你會想要確保你打電話給你流實例(this)的範圍內超類的構造函數(用於ES6類)或Readable構造在自己的構造函數(預ES6類/原型繼承)(例如Readable.call(this, { /*Optional Readable settings*/ })

+0

謝謝,這樣做的工作。爲什麼它不在文檔中? – Thomas

+0

如果您認爲它不夠清楚,請考慮在節點repo中提交一個PR,並改變措辭。有時候,對於那些長期在代碼庫中工作的人來說,第一次來這個項目的用戶可能會很困難。 – mscdex