流 API
注意:此功能在Web Workers中可用。
流 API 允许 JavaScript 以编程方式访问通过网络接收的数据流,并根据开发人员的需要对其进行处理。
概念和用法
流式传输涉及将要通过网络接收的资源分解成小块,然后逐位处理。浏览器在接收媒体资产时已经这样做 - 视频在下载更多内容时进行缓冲和播放,有时您也会看到图像随着加载更多内容而逐渐显示。
但是此功能以前从未对 JavaScript 可用。以前,如果我们想要处理某种资源(视频、文本文件等),我们必须下载整个文件,等待将其反序列化为合适的格式,然后处理所有数据。
使用流 API,您可以根据需要,在数据可用时立即使用 JavaScript 逐位处理原始数据,而无需生成缓冲区、字符串或 Blob。
还有更多优势 - 您可以检测流的开始或结束,将流链接在一起,根据需要处理错误和取消流,并对读取流的速度做出反应。
流的使用取决于使响应作为流可用。例如,成功获取请求返回的响应主体是一个ReadableStream
,可以使用使用ReadableStream.getReader()
创建的读取器来读取。
更复杂的用法涉及使用ReadableStream()
构造函数创建您自己的流,例如处理服务工作线程中的数据。
您还可以使用WritableStream
将数据写入流。
流接口
可读流
ReadableStream
-
表示可读的数据流。它可用于处理获取 API的响应流,或开发人员定义的流(例如,自定义
ReadableStream()
构造函数)。 ReadableStreamDefaultReader
-
表示默认读取器,可用于读取从网络提供的流数据(例如,获取请求)。
ReadableStreamDefaultController
-
表示控制器,允许控制
ReadableStream
的状态和内部队列。默认控制器适用于非字节流的流。
可写流
WritableStream
-
提供了一个标准的抽象,用于将流式数据写入目标(称为接收器)。此对象具有内置的反压和排队功能。
WritableStreamDefaultWriter
-
表示默认的可写流写入器,可用于将数据块写入可写流。
WritableStreamDefaultController
-
表示控制器,允许控制
WritableStream
的状态。在构造WritableStream
时,底层接收器会获得一个相应的WritableStreamDefaultController
实例来进行操作。
转换流
TransformStream
-
表示流对象的抽象,该对象在通过流对象管道链时转换数据。
TransformStreamDefaultController
-
提供用于操作与转换流关联的
ReadableStream
和WritableStream
的方法。
相关的流 API 和操作
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 的浏览器中加载。