概念与用法
流式传输涉及将您想要通过网络接收的资源分解成小块,然后逐块处理。浏览器在接收媒体资源时已经这样做了——视频在下载更多内容时进行缓冲和播放,有时您也会看到图像随着加载的增多而逐渐显示。
但以前 JavaScript 无法使用此功能。之前,如果我们想处理某种资源(视频、文本文件等),就必须下载整个文件,等待其反序列化为合适的格式,然后再处理所有数据。
有了 Streams API,您可以开始逐块处理原始数据,只要数据可用,就可以立即处理,而无需生成缓冲区、字符串或 Blob。

还有更多优势——您可以检测流的开始或结束,将流链接在一起,按需处理错误和取消流,以及响应流的读取速度。
Streams 的使用依赖于将响应作为流提供。例如,成功 fetch 请求返回的响应体是一个 ReadableStream,可以使用通过 ReadableStream.getReader() 创建的读取器来读取。
更复杂的用法涉及使用 ReadableStream() 构造函数创建自己的流,例如在 Service Worker 中处理数据。
您也可以使用 WritableStream 将数据写入流。
注意:您可以在我们的文章中找到更多关于流的理论和实践细节——Streams API 概念、使用可读流、使用可读字节流以及使用可写流。
Stream 接口
可读流 (Readable streams)
ReadableStream-
表示一个可读的数据流。它可以用于处理 Fetch API 的响应流,或开发者定义的流(例如,自定义的
ReadableStream()构造函数)。 ReadableStreamDefaultReader-
表示一个默认读取器,可用于读取网络提供的数据流(例如,fetch 请求)。
ReadableStreamDefaultController-
表示一个控制器,允许控制
ReadableStream的状态和内部队列。默认控制器用于非字节流。
可写流 (Writable streams)
WritableStream-
为将流式数据写入目的地(称为“宿”)提供了一个标准的抽象。此对象内置了反压和排队机制。
WritableStreamDefaultWriter-
表示一个默认的可写流写入器,可用于将数据块写入可写流。
WritableStreamDefaultController-
表示一个控制器,允许控制
WritableStream的状态。在构造WritableStream时,底层的宿会获得一个相应的WritableStreamDefaultController实例来操作。
转换流 (Transform Streams)
TransformStream-
表示一个流对象的抽象,该对象在数据通过流对象 管道链时转换数据。
TransformStreamDefaultController-
提供方法来操作与转换流相关的
ReadableStream和WritableStream。
相关的流 API 和操作
ByteLengthQueuingStrategy-
提供一个内置的字节长度排队策略,可在构造流时使用。
CountQueuingStrategy-
提供一个内置的块计数排队策略,可在构造流时使用。
对其他 API 的扩展
Request-
当构造一个新的
Request对象时,您可以在其RequestInit字典的body属性中传入一个ReadableStream。然后可以将此Request传递给fetch()来开始获取流。 Response.body-
成功 fetch 请求返回的响应体默认以
ReadableStream的形式暴露,可以附加读取器等。
与字节流相关的接口
ReadableStreamBYOBReader-
表示一个 BYOB (“bring your own buffer”,自带缓冲区) 读取器,可用于读取开发者提供的数据流(例如,自定义的
ReadableStream()构造函数)。 ReadableByteStreamController-
表示一个控制器,允许控制
ReadableStream的状态和内部队列。字节流控制器用于字节流。 ReadableStreamBYOBRequest-
表示
ReadableByteStreamController中的一个拉取请求。
示例
我们已经创建了一个示例目录来配合 Streams API 文档——请参阅 mdn/dom-examples/streams。示例如下:
- 简单的流泵 (Simple stream pump):此示例展示了如何消耗一个 ReadableStream 并将其数据传递给另一个。
- PNG 灰度化 (Grayscale a PNG):此示例展示了如何将 PNG 的 ReadableStream 转换为灰度。
- 简单的随机流 (Simple random stream):此示例展示了如何使用自定义流生成随机字符串,将它们排队作为块,然后再次读出。
- 简单的 tee 示例 (Simple tee example):此示例扩展了简单的随机流示例,展示了如何对流进行 tee 操作,以及如何独立读取两个结果流。
- 简单的写入器 (Simple writer):此示例展示了如何写入一个可写流,然后解码该流并将内容写入 UI。
- 解压 PNG 的块 (Unpack chunks of a PNG):此示例展示了如何使用
pipeThrough()将一个 PNG 文件的数据转换为 PNG 块流,从而将 ReadableStream 转换为其他数据类型的流。
来自其他开发者的示例
规范
| 规范 |
|---|
| Streams # rs-class |
| Streams # ws-class |
浏览器兼容性
api.ReadableStream
加载中…
api.WritableStream
加载中…