使用 fetch 实现流式传输:核心原理与实践

在现代前端开发中,流式传输(Streaming)技术越来越受到开发者的关注,尤其是在处理大文件、实时数据或需要逐步呈现内容的场景中。通过 fetch API 实现流式传输,可以在不阻塞 UI 的情况下逐步获取和处理数据,从而提升用户体验。

什么是流式传输?

流式传输是一种逐步获取数据的方式,不同于传统的请求响应模式(即一次性返回所有数据),流式传输允许你从服务器获取数据的同时,也能逐步处理数据。这种方式尤其适用于处理大规模数据(如视频、音频、大文件)或实时数据(如实时消息、实时日志等)的场景。

fetch API 与流式传输

fetch API 是现代浏览器中用于发起 HTTP 请求的标准方法。它支持响应体的流式读取,使得开发者能够逐步处理响应数据,而无需等待完整的响应返回。这一功能通过 ReadableStream 接口实现,允许我们逐块读取响应数据。

1. 获取流式响应

fetch API 返回的 Response 对象包含一个 body 属性,这个 body 是一个 ReadableStream,它代表着响应数据流。通过 ReadableStream,我们可以按需读取数据,而不是等待所有数据都被加载完成。

示例代码:

const response = await fetch('https://example.com/large-file');
const reader = response.body.getReader();

getReader() 方法返回一个 ReadableStreamDefaultReader 对象,我们可以使用它来按块读取数据。

2. 逐步读取数据

ReadableStreamDefaultReader 提供了 read() 方法,它会返回一个包含两个属性的对象:

  • done一个布尔值,表示流是否已结束。如果为 true,说明数据已经全部读取完毕。
  • value当前读取的数据块,通常是一个 Uint8Array 类型。

通过循环调用 read() 方法,我们可以逐步读取流中的数据。

示例代码:

const reader = response.body.getReader();
let receivedLength = 0;
let chunks = [];while (true) {const { done, value } = await reader.read();if (done) break;receivedLength += value.length;chunks.push(value);console.log(`Received ${receivedLength} bytes`);
}// 将数据块拼接成完整的内容
const fullResponse = new TextDecoder().decode(Uint8Array.from(chunks));

3. 解码和处理数据

value 返回的是一个 Uint8Array 类型的二进制数据,通常需要进行解码才能将其转换为文本内容。在 JavaScript 中,可以使用 TextDecoder 对象来解码这些二进制数据。

const text = new TextDecoder().decode(value);

4. 结束流式传输

donetrue 时,表示数据已经读取完毕,我们可以停止循环并进行后续处理。

const { done, value } = await reader.read();
if (done) {console.log("Streaming finished");break;
}

5. 错误处理

在实际应用中,流式传输过程中可能会出现错误,因此需要进行错误处理。可以使用 try-catch 语句捕获异常,并进行相应的处理。

try {const response = await fetch('https://example.com/large-file');const reader = response.body.getReader();// 处理流数据
} catch (error) {console.error('Error while fetching data:', error);
}

流式传输的应用场景

流式传输非常适合以下几种场景:

1. 大文件下载

在下载大文件时,使用流式传输可以避免一次性加载所有数据,减少内存消耗,提高效率。通过逐步读取数据,用户可以在下载过程中获得实时进度更新,甚至在下载完成之前开始处理文件的部分内容。

2. 实时数据传输

流式传输特别适合实时数据场景,例如实时聊天、股票行情更新、社交媒体流等。开发者可以逐步接收并处理数据,实时更新 UI,提升用户体验。

3. 视频/音频流

流式传输常用于视频和音频的流式播放。在这种场景下,浏览器会逐块下载视频或音频内容,并实时解码播放,确保用户能够平滑地观看或收听媒体内容,而无需等待完整文件下载完毕。

4. 处理大量文本数据

在需要处理大量文本数据的场景下(如大规模日志文件、长篇文章等),使用流式传输可以避免一次性加载所有数据导致的性能问题。开发者可以逐块处理文本,优化内存使用和响应时间。

总结

通过 fetch API 实现流式传输,可以有效提高大数据处理的效率和用户体验。无论是下载大文件、实时数据更新还是媒体流传输,流式传输都能帮助开发者避免阻塞 UI、减少内存占用,并使得数据处理更加高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线运行vscode

安装 https://github.com/coder/code-server?utm_sourcesyndication&pubDate20250317 运行前预览脚本 curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run运行脚本 curl -fsSL https://code-server.dev/install.sh | sh其他 可以通过后台服务运行&am…

【Tauri2】002——Cargo.toml和入口文件

目录 前言 正文 toml文件的基础 注释——# Comment 键值对——Key/Value 表——[table] 内联表——Inline Table 数组——Array package和crate Cargo.toml文件 Cargo.toml——dependencies Cargo.toml——lib crate-type main.rs 前言 【Tauri2】001——安装及…

Netty源码—7.ByteBuf原理三

大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.ByteBuf的回收 9.Netty的内存规格 (1)4种内存规格 (2)内存申请单位 (1)4种内存规格 一.tiny:表示从…

W、M、C练题笔记(持续更新中)

web here are the flag 点击,页面跳转404.php,用bp抓包访问/flag.php页面,得到flag用base64解码 TryToFindFlag 打开后查看源代码 发现是robots协议,访问robots.txt 访问flllaaa......,得到空白页面,查看…

【高项】信息系统项目管理师(十二)项目干系人管理【3分】

项目干系人管理包括识别能够影响项目或会受项目影响的人员、团队或组织,分析干系人对项目的期望和影响,制定管理策略有效调动干系人参与项目决策和执行。项目干系人管理过程能够支持项目团队的工作。一、管理基础 1、管理的重要性 项目经理和团队管理干系人的能力决定着项目…

Keil(ARMCC)编译改为Cmake(GNU)编译

1. 环境介绍: 某款ARM-M4芯片(应该芯片通用)cmkeGNUNinja(CLion) 2. 必备: 芯片启动文件 startup_xxxx.s链接文件 xxxx_flash.ldCMakeLists.txt 3. 具体修改步骤 第一步:观察启动文件…

SpringCould微服务架构之Docker(4)

Docker ce是社区版。 安装docker之前,先安装yum-util 。 安装docker之前,一定要先关闭防火墙。

LangChain开发(四)服务监控(LangSmith、verbose、debug)

文章目录 LangChain服务监控LangSmith Tracing(跟踪)Verbose(1详细日志打印)Debug(调试日志打印)源码地址参考资料 LangChain服务监控 与构建任何类型的软件一样,使用LLM构建时,总会…

从车间到数字生态:MES如何引领制造业智能化革命‌

在全球制造业加速迈向工业4.0的浪潮中,传统生产模式正经历颠覆性变革。制造执行系统(MES)作为连接物理车间与数字世界的核心纽带,正从“生产辅助工具”升级为“智能决策大脑”,推动制造业向数据驱动、柔性化与可持续化…

人工智能之数学基础:瑞利商的推广形式——广义瑞利商

本文重点 在数学和工程领域,瑞利商(Rayleigh quotient)的推广形式——广义瑞利商(Generalized Rayleigh quotient)扮演着重要的角色。它们不仅为线性代数中的特征值问题提供了新的视角,还在信号处理、机器学习、计算机视觉等领域有广泛的应用。 广义瑞利商的定义 广义…

【QT】QT中的中文显示乱码解决

QT中的中文显示乱码解决 1.编辑栏左键——>选择编码 2.选择UTF-8—>按编码重新载入 3.工具栏左键—>选择选项 4.同样选择UTF-8—>确定即可

优选算法系列(4.前缀和 _下) k

目录 五:和为 k 的子数组(medium) 题目链接:560. 和为 K 的子数组 - 力扣(LeetCode) 解法: 代码: 六:和可被 K 整除的子数组(medium) 题目链…

批量处理word里面表格的空白行

1,随便打开一个word文档。 2,按下Alt F11 VBA编辑器,在左侧的「工程资源管理器」窗口中找到Normal 项目,右键选择插入->模块。 弹出一下弹窗 3,输入一下代码 代码: Sub RemoveEmptyTableRows()Dim tbl As TableDim row As R…

《Linux运维实战:Ubuntu 22.04使用pam_faillock实现登录失败处理策略》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、背景信息 在ubuntu 22.04中,pam_tally2模块已被弃用,取而代之的是pam_faillock模块。因此&#xf…

如何通过数据可视化提升管理效率

通过数据可视化提升管理效率的核心方法包括清晰展示关键指标、及时发现和解决问题、支持决策优化。其中,清晰展示关键指标尤为重要。通过数据可视化工具直观地呈现关键绩效指标(KPI),管理者能快速、准确地理解业务现状&#xff0c…

Qt的文件操作

Qt的文件操作 由于 Qt 的发展比较早,在 C 尚未提供标准的文件流操作时,Qt 就研发出了自己的文件操作并沿用至今。Qt 提供了丰富的文件操作类,包括 QFile 文件操作和读写类以外,还有 QSaveFile(安全文件保存类&#xf…

Netty源码—7.ByteBuf原理四

大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.ByteBuf的回收 13.Page级别的内存分配 (1)Page级别的内存分配的入口 (2)Page级别的内存分配的流程 (3)尝试在现…

Leetcode 最小基因变化

java solution&#xff1a;BFS 算法 class Solution {public int minMutation(String startGene, String endGene, String[] bank) {//首先创建一个集合来存储有效基因串Set<String> bankSet new HashSet<>(Arrays.asList(bank));if(!bankSet.contains(endGene))…

Hive工作所遇问题之Hive -e命令中使用正则表达式问题

前言 今天工作因为之前建表时&#xff0c;看不到数据&#xff0c;导致建表的字段格式有问题&#xff0c;然后使用split函数拆分时&#xff0c;发现是正则表达式使用的问题。 下面来说明问题 一、数据准备 --创建码表&#xff1a; create table hive_sql.d_type( type_id st…

自动化框架的设计与实现

一、自动化测试框架 在大部分测试人员眼中只要沾上“框架”&#xff0c;就感觉非常神秘&#xff0c;非常遥远。大家之所以觉得复杂&#xff0c;是因为落地运用起来很复杂&#xff1b;每个公司&#xff0c;每个业务及产品线的业务流程都不一样&#xff0c;所以就导致了“自动化…