跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScriptNode.js大前端

JavaScript Streams API 核心概念与原理

Streams API 旨在解决 Web 应用消费有序小块数据的问题,适用于网络请求响应或视频处理等场景。API 定义了可读流、可写流和转换流三种类型,分别对应数据的读取、写入及转换。流的基本单位为块(chunk),通过内部队列平衡数据进出速率。当入队快于出队时,流触发反压机制通知生产者暂停发送,直至队列降至高水位线阈值以下,从而避免内存溢出。

星云发布于 2024/3/27更新于 2026/10/2481 浏览
JavaScript Streams API 核心概念与原理

Streams API 是为了解决一个简单但又基础的问题而生的:Web 应用如何消费有序的小块信息而不是大块信息?这种能力主要有两种应用场景。

  • 大块数据可能不会一次性都可用。网络请求的响应就是一个典型的例子。网络负载是以连续信息包形式交付的,而流式处理可以让应用在数据一到达就能使用,而不必等到所有数据都加载完毕。
  • 大块数据可能需要分小部分处理。视频处理、数据压缩、图像编码和 JSON 解析都是可以分成小部分进行处理,而不必等到所有数据都在内存中时再处理的例子。

Streams API 在 fetch() 中有典型应用,不过 Streams API 本身是通用的。实现 Observable 接口的 JavaScript 库共享了很多流的基础概念。

理解流

提到流,可以把数据想像成某种通过管道输送的液体。JavaScript 中的流借用了管道相关的概念,因为原理是相通的。根据规范,'这些 API 实际是为映射低级 I/O 原语而设计,包括适当时候对字节流的规范化'。Stream API 直接解决的问题是处理网络请求和读写磁盘。

Stream API 定义了三种流。

  • 可读流:可以通过某个公共接口读取数据块的流。数据在内部从底层源进入流,然后由消费者(consumer)进行处理。
  • 可写流:可以通过某个公共接口写入数据块的流。生产者(producer)将数据写入流,数据在内部传入底层数据槽(sink)。
  • 转换流:由两种流组成,可写流用于接收数据(可写端),可读流用于输出数据(可读端)。这两个流之间是转换程序(transformer),可以根据需要检查和修改流内容。

块、内部队列和反压

流的基本单位是块(chunk)。块可以是任意数据类型,但通常是定型数组。每个块都是离散的流片段,可以作为一个整体来处理。更重要的是,块不是固定大小的,也不一定按固定间隔到达。在理想的流当中,块的大小通常近似相同,到达间隔也近似相等。不过好的流实现需要考虑边界情况。

前面提到的各种类型的流都有入口和出口的概念。有时候,由于数据进出速率不同,可能会出现不匹配的情况。为此流平衡可能出现如下三种情形。

  • 流出口处理数据的速度比入口提供数据的速度快。流出口经常空闲(可能意味着流入口效率较低),但只会浪费一点内存或计算资源,因此这种流的不平衡是可以接受的。
  • 流入和流出均衡。这是理想状态。
  • 流入口提供数据的速度比出口处理数据的速度快。这种流不平衡是固有的问题。此时一定会在某个地方出现数据积压,流必须相应做出处理。

流不平衡是常见问题,但流也提供了解决这个问题的工具。所有流都会为已进入流但尚未离开流的块提供一个内部队列。对于均衡流,这个内部队列中会有零个或少量排队的块,因为流出口块出列的速度与流入口块入列的速度近似相等。这种流的内部队列所占用的内存相对比较小。

如果块入列速度快于出列速度,则内部队列会不断增大。流不能允许其内部队列无限增大,因此它会使用反压(backpressure)通知流入口停止发送数据,直到队列大小降到某个既定的阈值之下。这个阈值由排列策略决定,这个策略定义了内部队列可以占用的最大内存,即高水位线(high water mark)。

目录

  1. 理解流
  2. 块、内部队列和反压

更多推荐文章

查看全部
  • Java RSA 数字签名实现与校验详解
  • RocketMQ 与 RabbitMQ 全方位深度对比分析
  • C++ 语言基础与进阶学习教程
  • 如何成为 AI 产品经理:核心能力模型与实战案例
  • GitHub Copilot 提示词工程实战:从入门到精通
  • 热门开源 AI 大模型项目精选与总结
  • C++ STL 基础:迭代器、auto 与范围循环
  • ClawdBot 多语言翻译 Telegram 机器人部署与配置指南
  • 安卓系统Chrome内核:Android System WebView
  • Docker 在 Ubuntu 系统上的详细安装指南
  • 连通块问题解析与 C++ 代码实现
  • 本地大模型部署指南:Ollama 安装与 Python 调用
  • Python Addict 库基本用法与特性
  • 算法题解:LeetCode 389 找不同
  • 智能体工作流导出与导入实战:以 12345 政务热线为例
  • 2026 年主流 AI Agent 框架横评:OpenClaw 系列对比与场景推荐
  • Flutter 三方库 ethereum_addresses 的鸿蒙化适配指南
  • Python 爬虫实战:跨境电商数据采集与代理 IP 应用
  • 哈希表原理、冲突解决与 C++ 实现
  • DeOldify Web UI 性能优化:图片懒加载、Base64 压缩与 WebP 转换

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online