在node.js文档中,我遇到了以下代码
const readable = getReadableStreamSomehow();
// 'readable' may be triggered multiple times as data is buffered in
readable.on('readable', () => {
let chunk;
console.log('Stream is readable (new data received in buffer)');
// Use a loop to make sure we read all currently available data
while (null !== (chunk = readable.read())) {
console.log(`Read ${chunk.length} bytes of data...`);
}
});
// 'end' will be triggered once when there is no more data available
readable.on('end', () => {
console.log('Reached end of stream.');
});
下面是node.js文档中关于while循环用法的注解,说明需要使用while循环来确保读取所有数据
// Use a loop to make sure we read all currently available data
while (null !== (chunk = readable.read())) {
我不明白为什么需要它,并试图用if
语句替换while
,并且在第一次读取后过程终止。为什么?
2条答案
按热度按时间pod7payv1#
来自node.js文档
readable.read()方法只能在以暂停模式运行的Readable流上调用。在流模式下,readable.read()会被自动调用,直到内部缓冲区被完全耗尽。
请注意,此方法仅适用于已暂停的流。
更进一步,如果你理解了什么是 stream,你就会明白你需要处理大量的数据。
每次调用readable.read()都会返回一个数据块或null。块不被连接。while循环是消耗当前缓冲区中的所有数据所必需的。
所以我希望你明白,如果你不循环通过你的可读流,只执行1读,你不会得到你的全部数据。
参考:https://nodejs.org/api/stream.html
zkure5ic2#
使用循环来确保我们读取了所有当前可用的数据
我不明白为什么需要它
在上面的例子中注意,你可以传递size(可选)参数到read方法来指定要读取的数据量。如果我们有更多的数据(〉1字节)可供读取,那么while循环将有助于读取超过1字节的数据。
它重复读取流数据,直到没有更多的数据要读取。它暂停循环执行,直到流缓冲区中有新数据可用。read()将暂停循环执行(当return为null或buffer处于空状态时),直到有更多数据可用。
如果未指定size参数,则将返回内部缓冲区中包含的所有数据。
当执行处于暂停状态且buffer中有新数据时,会发出readable事件。
并尝试用just if语句替换while,而进程在第一次读取后终止。为什么?
if语句只执行**read()**一次(缓冲区状态未清空),并且不会暂停执行以获得更多可用数据。因此,在读取第一个块(在我们的示例中为1个字节)后,它停止执行。