可读流:getReader() 方法

注意:此功能在Web Workers中可用。

getReader() 方法是 ReadableStream 接口的一个方法,它创建一个读取器并将其锁定到流上。在流被锁定期间,无法获取其他读取器,直到此读取器被释放。

语法

js
getReader()
getReader(options)

参数

options 可选

包含以下属性的对象

mode 可选

指定要创建的读取器类型的属性。值可以是

  • "byob",这将导致创建一个 ReadableStreamBYOBReader,它可以读取可读字节流(当内部流缓冲区为空时,支持从底层字节源到读取器的零拷贝传输的流)。
  • undefined(或根本未指定 - 这是默认值),这将导致创建一个 ReadableStreamDefaultReader,它可以从流中读取单个块。

返回值

一个 ReadableStreamDefaultReaderReadableStreamBYOBReader 对象实例,具体取决于 mode 值。

异常

RangeError

如果提供的 mode 值不是 "byob"undefined,则抛出此异常。

TypeError

如果您尝试为其创建读取器的流已被锁定或不是 ReadableStream,则抛出此异常。如果请求了 BYOB 读取器并且流控制器不是 ReadableByteStreamController(流不是 构造 为具有 type="bytes" 的底层源),则也会抛出此异常。

示例

在以下简单示例中,先前创建的自定义 ReadableStream 使用使用 getReader() 创建的 ReadableStreamDefaultReader 读取。(有关完整代码,请参阅我们的 简单随机流示例)。每个块按顺序读取并输出到 UI,直到流读取完成,此时我们从递归函数返回并将整个流打印到 UI 的另一部分。

js
function fetchStream() {
  const reader = stream.getReader();
  let charsReceived = 0;

  // read() returns a promise that resolves
  // when a value has been received
  reader.read().then(function processText({ done, value }) {
    // Result objects contain two properties:
    // done  - true if the stream has already given you all its data.
    // value - some data. Always undefined when done is true.
    if (done) {
      console.log("Stream complete");
      para.textContent = value;
      return;
    }

    // value for fetch streams is a Uint8Array
    charsReceived += value.length;
    const chunk = value;
    let listItem = document.createElement("li");
    listItem.textContent = `Received ${charsReceived} characters so far. Current chunk = ${chunk}`;
    list2.appendChild(listItem);

    result += chunk;

    // Read some more, and call this function again
    return reader.read().then(processText);
  });
}

规范

规范
流标准
# ref-for-rs-get-reader⑤

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅