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

JavaScript Streams API 核心概念与原理

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

星云发布于 2024/3/27更新于 2026/5/3117 浏览
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. 块、内部队列和反压
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • IoT DevOps 实战:基于设备影子的万级集群自动化运维架构
  • Ubuntu 20.04/22.04 使用 NVM 安装 Node.js 22 LTS 版本
  • 洪水填充算法与 DFS/BFS 应用总结
  • Python+AI 入门实战:轻量化工具与大模型微调
  • GitHub 镜像加速:Gitee 与 Coding 开源项目克隆指南
  • Ubuntu 24.04 LTS 安装 NVIDIA 显卡驱动、CUDA 12.5 及 Docker 容器工具包
  • Git filter-repo 历史重写工具深度指南
  • Java Web 影城会员管理系统:SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0
  • 位运算实战:判断字符唯一性与查找缺失数字
  • 前端 WebSocket 实战:告别轮询实现实时通信
  • Codex 代码生成模型简介
  • 利用 AI 工具实现软件原型自动绘制与代码生成
  • 毕业论文写作困境分析与智能辅助工具应用
  • Agent-Browser:面向 AI 的浏览器自动化 CLI 工具指南
  • OpenClaw 对接飞书实现多机器人群聊配置
  • 2026 年 Python AI 开源工具精选:从 Agent 框架到大模型推理实战
  • IDEA 迁移至 Trae AI IDE:SpringBoot+Maven+Vue 项目配置
  • C++ 原子操作 compare_exchange_weak 详解
  • Web 技术核心与安全风险(三):PHP 基础与数据交互
  • GitHub Trending AI 榜单速览:无线感知、Agent 技能与数字伙伴

相关免费在线工具

  • 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