Stream API - 基础知识

Stream API 允许开发人员访问通过网络接收的数据流,并借助 JavaScript 编程语言根据需要逐位处理它们。 其中流是我们希望通过网络以小块形式接收的数据序列,然后我们逐位处理这些小块。

在流式传输之前,如果我们想要处理视频、音频或文本文件,我们需要从网络下载完整的文件并等待其反序列化为指定的格式,然后处理完整的下载文件。

引入流后,整个工作文化发生了变化,现在我们可以在客户端使用 JavaScript 接收到数据后立即开始逐位处理数据,而无需创建任何额外的缓冲区或 blob。 使用流,我们可以执行各种任务,例如可以找到流的开始和结束,或者可以将流链接在一起,或者可以轻松处理错误,可以取消流等等。

流媒体用于创建现实世界的应用程序,例如 Netflix、Amazon Prime Videos、Zee5、Voot、YouTube 等视频流应用程序。这样用户无需下载即可轻松在线观看电影、电视节目等。 Stream API 提供了多种功能,如 ReadableStream、Teeing、WritableStream、Pipe Chains、BackPressure、内部队列和排队策略。 让我们一一详细讨论。

可读流

可读流允许您使用 ReadableStream 对象从 JavaScript 源读取数据/块。 块是读取器将按顺序读取的小数据片段。 它可以是单个位,也可以是大尺寸,如类型化数组等。要读取可读流,API 需要提供一个读取器。 它从流中读取块,然后处理块的数据。 一次只有一个读取器可以读取一个流,不允许其他读取器读取该流。

基本流

可写流

可写流允许您使用可写流对象在 JavaScript 中写入数据。 数据由写入器写入流中。 写入器以块的形式写入数据(一次一个块)。 当创建写入器并开始写入流时,该写入器将锁定流,并且不允许其他写入器访问该流,并且使用内部队列来跟踪写入器写入的块。

基本流

Teeing

Teeing 是一个将流分成两个相同的流副本的过程,以便两个单独的读取器可以同时读取该流。 我们可以借助 ReableStream.tee() 方法来实现发球。 此方法返回一个数组,其中包含指定流的两个相同副本,并且可由两个读取器读取。

Teeing

Pipe Chain

Pipe Chain是一个将多个流连接在一起以创建数据处理流的过程。 在 Stream API 中,我们可以借助管道链结构将一个流传输到另一个流中。 管链的起点称为原始源,管链的终点称为最终汇。

要通过管道传输流,我们可以使用以下方法 −

ReadableStream.pipeThrough() − 此方法用于通过转换流传输当前流。 转换流包含一对可读可写流。

ReadableStream.pipeTo() − 此方法用于将当前的 ReadableStream 传输到指定的 WritableStream,并返回一个 Promise,当传输过程成功完成或由于某些错误而被拒绝时,该 Promise 会解析。

Pipe Chains

Backpressure

Backpressure 是 Stream API 中的一个特殊概念。 在此过程中,单个流或管道链控制读/写的速度。 假设我们有一个流,该流很忙并且无法获取新的数据块,因此它通过链发送向后消息,告诉转换流放慢数据块的传送,以便我们可以避免瓶颈。

我们可以在 ReadableStream 中使用背压,因此我们需要借助 ReadableStreamDefaultContriller.desiredSize 属性找到消费者所需的块大小。 如果块大小非常小,则 ReadableStream 可以指示它是底层源,因此停止发送更多数据并随流链发送背压。

当消费者再次想要接收到的数据时,我们使用 pull 方法告诉底层源将数据发送到流。

内部队列和排队策略

内部队列是跟踪那些尚未处理或完成的块的队列。 例如,在可读流中,内部队列跟踪那些存在于队列中但尚未读取的块。 内部队列使用排队策略来表示反压信号如何根据内部队列状态发送。

结论

以上就是Stream API的基本概念。 一般用于在线流媒体。 当您在线观看视频时,浏览器或应用程序在后台接收连续的数据块流,然后由该浏览器或应用程序处理它们以显示视频。 现在在下一篇文章中,我们将了解 Stream API 的 Readable Stream。