ReadableStream: getReader() 方法

Baseline 已广泛支持

此功能已成熟,并可在多种设备和浏览器版本上使用。自 ⁨2019 年 1 月⁩起,它已在所有浏览器中可用。

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

ReadableStream 接口的 getReader() 方法会创建一个 reader 并将流锁定给该 reader。当流被锁定后,在释放该 reader 之前,无法获取其他 reader。

语法

js
getReader()
getReader(options)

参数

options 可选

包含以下属性的对象:

mode 可选

一个指定要创建的 reader 类型的属性。值可以是

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

返回值

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

异常

RangeError

如果提供的 mode 值不是 "byob"undefined,则会抛出此错误。

TypeError

如果你试图为其创建 reader 的流已经被锁定,或者不是一个 ReadableStream,则会抛出此错误。如果请求 BYOB reader 但流控制器不是 ReadableByteStreamController(该流不是通过 type="bytes"构造 函数设置的底层源),也会抛出此错误。

示例

在下面的简单示例中,使用 getReader() 创建的 ReadableStreamDefaultReader 读取了一个先前创建的自定义 ReadableStream。(有关完整代码,请参阅我们的 简单随机流示例)。每个块被依次读取并输出到 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);
  });
}

规范

规范
Streams
# ref-for-rs-get-reader⑤

浏览器兼容性

另见