2014-07-01 62 views
0

這個問題實際上已經被Brad問到了,但是我還沒有發現真正的問題。必須在readable.read()以內可讀的事件處理程序被重複調用?在當前節點文檔中,示例代碼讀取爲:Node.js流repeat.read重複調用

var readable = getReadableStreamSomehow(); 
readable.on('readable', function() { 
    var chunk; 
    while (null !== (chunk = readable.read())) { 
    console.log('got %d bytes of data', chunk.length); 
    } 
}); 

readable.read()被重複調用。

該文件說,這大約可讀事件:

一旦內部緩衝器排空,當更多的數據是可用的可讀事件將再次觸發。

它還說,這大約read()

如果不指定大小參數,則它會在內部緩衝區返回的所有數據。

那麼是否有任何情況下,把它放在一個while循環重複調用read()必要?

回答

1

首先,這會導致你的服務器以禁止如果讀取永遠不會返回NULL:

while (null !== (chunk = readable.read())) { 
    console.log('got %d bytes of data', chunk.length); 
    } 

除非指定的大小參數,你只需要調用每次讀取一次的「可讀」事件被解僱。如果您確實指定了大小,並且大小小於要讀取的數據總量,則必須根據需要多次調用它。

您有readable.on('end', ...這將讓您知道什麼時候沒有更多的數據可用。

+0

然後在文檔中的示例站立正確,我猜。 – huggie

+0

根據當時預期版本v.10(https://dl.dropboxusercontent.com/u/3685/presentations/streams2/streams2-ko.pdf)之前的討論,返回null是規範的一部分。 ,可讀的事件只有在它返回null後纔會被觸發。也許這就是爲什麼文檔使用while循環。也許這就是爲什麼它有必要嗎?因爲如果你沒有閱讀,直到它是空的,那麼它還沒有返回null。 – huggie

+0

無論如何,文檔肯定不會反映null必須由另一個可讀事件之前的readable.read()返回,只是緩衝區爲空。 – huggie

0

在對象模式下,.read()只返回一個對象,所以這將是必要的。我不確定這是否是二進制碼流所必需的,但我已經成功地僅在readable事件中調用了.read()