ReadableStreamDefaultReader

Baseline 广泛可用 *

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

* 此特性的某些部分可能存在不同级别的支持。

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

ReadableStreamDefaultReader 接口是 Streams API 的一部分,它表示一个默认的读取器,可用于读取从网络(例如 fetch 请求)提供的数据流。

ReadableStreamDefaultReader 可用于读取任何类型的底层数据源的 ReadableStream(与只能用于具有底层字节源的可读流的 ReadableStreamBYOBReader 不同)。

但请注意,仅当底层源是自动分配缓冲区的底层字节源时,才支持从底层源进行零拷贝传输。换句话说,该流必须在 构造 时同时指定 type="bytes"autoAllocateChunkSize。对于任何其他底层源,流将始终通过内部队列中的数据来满足读取请求。

构造函数

ReadableStreamDefaultReader()

创建并返回一个 ReadableStreamDefaultReader 对象实例。

实例属性

ReadableStreamDefaultReader.closed 只读

返回一个 Promise,当流关闭时,该 Promise 会 fulfilled;如果流抛出错误或读取器的锁被释放,则会 rejected。此属性使您能够编写响应流结束的代码。

实例方法

ReadableStreamDefaultReader.cancel()

返回一个 Promise,当流被取消时解析。调用此方法表示消费者对该流不再感兴趣。提供的 reason 参数将传递给底层源,源可能会也可能不会使用它。

ReadableStreamDefaultReader.read()

返回一个 Promise,提供对流内部队列中下一个块的访问。

ReadableStreamDefaultReader.releaseLock()

释放读取器对流的锁定。

示例

在以下示例中,创建了一个人工 Response,用于将从另一个资源获取的 HTML 片段流式传输到浏览器。

它演示了 ReadableStreamUint8Array 结合使用的用法。

js
fetch("https://www.example.org/").then((response) => {
  const reader = response.body.getReader();
  const stream = new ReadableStream({
    start(controller) {
      // The following function handles each data chunk
      function push() {
        // "done" is a Boolean and value a "Uint8Array"
        return reader.read().then(({ done, value }) => {
          // Is there no more data to read?
          if (done) {
            // Tell the browser that we have finished sending data
            controller.close();
            return;
          }

          // Get the data and send it to the browser via the controller
          controller.enqueue(value);
          push();
        });
      }

      push();
    },
  });

  return new Response(stream, { headers: { "Content-Type": "text/html" } });
});

规范

规范
Streams
# default-reader-class

浏览器兼容性

另见