为什么在Node.js中需要while循环来阅读非流动模式流?

imzjd6km  于 2023-05-06  发布在  Node.js
关注(0)|答案(2)|浏览(116)

在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,并且在第一次读取后过程终止。为什么?

pod7payv

pod7payv1#

来自node.js文档
readable.read()方法只能在以暂停模式运行的Readable流上调用。在流模式下,readable.read()会被自动调用,直到内部缓冲区被完全耗尽。
请注意,此方法仅适用于已暂停的流。
更进一步,如果你理解了什么是 stream,你就会明白你需要处理大量的数据。
每次调用readable.read()都会返回一个数据块或null。块不被连接。while循环是消耗当前缓冲区中的所有数据所必需的。
所以我希望你明白,如果你不循环通过你的可读流,只执行1读,你不会得到你的全部数据。
参考:https://nodejs.org/api/stream.html

zkure5ic

zkure5ic2#

使用循环来确保我们读取了所有当前可用的数据
我不明白为什么需要它

const SIZE_IN_BYTES = 1;

process.stdin.on('readable', function () {
  console.log('Data available to read');
  let chunk;
  while ((chunk = process.stdin.read(SIZE_IN_BYTES)) !== null) {
    console.log(`Reading 1 byte ${chunk.toString()}`);
  }
});

在上面的例子中注意,你可以传递size(可选)参数到read方法来指定要读取的数据量。如果我们有更多的数据(〉1字节)可供读取,那么while循环将有助于读取超过1字节的数据。
它重复读取流数据,直到没有更多的数据要读取。它暂停循环执行,直到流缓冲区中有新数据可用。read()将暂停循环执行(当return为null或buffer处于空状态时),直到有更多数据可用。
如果未指定size参数,则将返回内部缓冲区中包含的所有数据。
当执行处于暂停状态且buffer中有新数据时,会发出
readable
事件。
并尝试用just if语句替换while,而进程在第一次读取后终止。为什么?
if语句只执行**read()**一次(缓冲区状态未清空),并且不会暂停执行以获得更多可用数据。因此,在读取第一个块(在我们的示例中为1个字节)后,它停止执行。

相关问题