流 API

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

流 API 允许 JavaScript 以编程方式访问通过网络接收的数据流,并根据开发人员的需要对其进行处理。

概念和用法

流式传输涉及将要通过网络接收的资源分解成小块,然后逐位处理。浏览器在接收媒体资产时已经这样做 - 视频在下载更多内容时进行缓冲和播放,有时您也会看到图像随着加载更多内容而逐渐显示。

但是此功能以前从未对 JavaScript 可用。以前,如果我们想要处理某种资源(视频、文本文件等),我们必须下载整个文件,等待将其反序列化为合适的格式,然后处理所有数据。

使用流 API,您可以根据需要,在数据可用时立即使用 JavaScript 逐位处理原始数据,而无需生成缓冲区、字符串或 Blob。

The basic concept of the stream API is data is fetched from the network in several data packets. The data is processed, and then sent to the browser in a stream of data packets.

还有更多优势 - 您可以检测流的开始或结束,将流链接在一起,根据需要处理错误和取消流,并对读取流的速度做出反应。

流的使用取决于使响应作为流可用。例如,成功获取请求返回的响应主体是一个ReadableStream,可以使用使用ReadableStream.getReader()创建的读取器来读取。

更复杂的用法涉及使用ReadableStream()构造函数创建您自己的流,例如处理服务工作线程中的数据。

您还可以使用WritableStream将数据写入流。

注意:您可以在我们的文章中找到关于流的理论和实践的更多详细信息 - 流 API 概念使用可读流使用可读字节流使用可写流

流接口

可读流

ReadableStream

表示可读的数据流。它可用于处理获取 API的响应流,或开发人员定义的流(例如,自定义ReadableStream()构造函数)。

ReadableStreamDefaultReader

表示默认读取器,可用于读取从网络提供的流数据(例如,获取请求)。

ReadableStreamDefaultController

表示控制器,允许控制ReadableStream的状态和内部队列。默认控制器适用于非字节流的流。

可写流

WritableStream

提供了一个标准的抽象,用于将流式数据写入目标(称为接收器)。此对象具有内置的反压和排队功能。

WritableStreamDefaultWriter

表示默认的可写流写入器,可用于将数据块写入可写流。

WritableStreamDefaultController

表示控制器,允许控制WritableStream的状态。在构造WritableStream时,底层接收器会获得一个相应的WritableStreamDefaultController实例来进行操作。

转换流

TransformStream

表示流对象的抽象,该对象在通过流对象管道链时转换数据。

TransformStreamDefaultController

提供用于操作与转换流关联的ReadableStreamWritableStream的方法。

ByteLengthQueuingStrategy

提供了一个内置的字节长度排队策略,可在构造流时使用。

CountQueuingStrategy

提供了一个内置的块计数排队策略,可在构造流时使用。

对其他 API 的扩展

请求

当构造新的Request对象时,可以在其RequestInit字典的body属性中传递ReadableStream。然后,此Request可以传递给fetch()以开始获取流。

Response.body

成功获取请求返回的响应主体默认情况下以ReadableStream形式公开,并且可以附加读取器等。

ReadableStreamBYOBReader

表示 BYOB(“自带缓冲区”)读取器,可用于读取开发人员提供的流数据(例如,自定义ReadableStream()构造函数)。

ReadableByteStreamController

表示控制器,允许控制ReadableStream的状态和内部队列。字节流控制器用于字节流。

ReadableStreamBYOBRequest

表示ReadableByteStreamController中的拉取请求。

示例

我们创建了一个示例目录,与流 API 文档一起使用 - 请参阅mdn/dom-examples/streams。示例如下

  • 简单的流泵:此示例显示如何使用 ReadableStream 并将其数据传递给另一个。
  • 将 PNG 图像转换为灰度:此示例显示如何将 PNG 的 ReadableStream 转换为灰度。
  • 简单的随机流:此示例显示如何使用自定义流生成随机字符串,将它们作为块入队,然后再次读取它们。
  • 简单的三通示例:此示例扩展了简单的随机流示例,显示了如何对流进行三通处理,以及如何独立读取两个生成的流。
  • 简单的写入器:此示例显示如何写入可写流,然后解码流并将内容写入 UI。
  • 解压缩 PNG 的块:此示例显示如何使用pipeThrough()通过将 PNG 文件的数据转换为 PNG 块流来将 ReadableStream 转换为其他数据类型的流。

来自其他开发人员的示例

规范

规范
流标准
# rs-class
流标准
# ws-class

浏览器兼容性

api.ReadableStream

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

api.WritableStream

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

另请参阅