Streams API

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

Streams API 允许 JavaScript 以编程方式访问通过网络接收的数据流,并由开发者按需处理这些数据流。

概念与用法

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

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

有了 Streams API,您可以开始逐块处理原始数据,只要数据可用,就可以立即处理,而无需生成缓冲区、字符串或 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.

还有更多优势——您可以检测流的开始或结束,将流链接在一起,按需处理错误和取消流,以及响应流的读取速度。

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

提供方法来操作与转换流相关的 ReadableStreamWritableStream

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。示例如下:

来自其他开发者的示例

规范

规范
Streams
# rs-class
Streams
# ws-class

浏览器兼容性

api.ReadableStream

api.WritableStream

另见