前端开发处理‘流式数据’与‘非流式数据’,在接收完整与非完整性数据时应该如何渲染和使用

在前端开发中,处理 非流式数据流式数据 的方式不同。根据是否完整接收数据、是否实时渲染的需求,可以分为以下四种典型场景:


一、四类常见场景总结

类型数据完整性是否实时渲染适用技术/方法
A完整数据(一次性返回)否(等全部加载完)fetch, axios, JSON.parse()
B完整数据(一次性返回)是(模拟逐字显示)setTimeout / requestAnimationFrame 模拟打字效果
C不完整数据(分段传输)否(等全部加载完)buffer 缓存 + 最终解析
D不完整数据(分段传输)是(边接收边渲染)ReadableStream, SSE, WebSocket, JSON 增量解析

场景对比表

场景是否流式是否实时渲染是否需要增量解析代表应用
A非流式不需要获取静态数据
B非流式不需要AI 回答展示
C流式需要日志聚合、大文件解析
D流式需要AI 聊天机器人、代码生成器

具体情况和项目还需要具体分析,并非生搬这四种场景。以下为场景对比的详解与实现:

场景详解与实现方案


场景 A:完整数据 + 非实时渲染(最常见)

适用于传统 API 请求,如获取用户列表、文章内容等。

示例代码:
const response = await fetch('/api/data');
const data = await response.json();
render(data);
渲染逻辑:
function render(data) {document.getElementById('content').innerText = data.content;
}

场景 B:完整数据 + 实时渲染(模拟打字效果)

适用于需要“逐字显示”的视觉效果,比如 AI 对话界面。

示例代码:
const response = await fetch('/api/data');
const data = await response.json();simulateTyping(data.content, document.getElementById('output'), 50);
打字函数实现:
function simulateTyping(text, element, interval = 50) {let index = 0;const timer = setInterval(() => {if (index < text.length) {element.textContent += text[index++];} else {clearInterval(timer);}}, interval);
}

场景 C:不完整数据 + 非实时渲染(等待拼接完成)

适用于大文件下载、日志聚合等场景,需等到所有数据接收完毕后再统一处理。

示例代码:
let buffer = '';while (true) {const { done, value } = await reader.read();if (done) break;buffer += decoder.decode(value, { stream: true });
}// 等待完成后统一解析
const finalData = JSON.parse(buffer);
render(finalData);

场景 D:不完整数据 + 实时渲染(流式解析 + 边接收边展示)

适用于 AI 流式回复、聊天机器人、代码生成器 等场景,需边接收边解析边渲染。

核心流程:
  1. 接收 chunk 数据
  2. 拼接到 buffer
  3. 尝试增量解析
  4. 提取有效字段并更新 UI
示例代码(结合 jsonparse):
import sax from 'jsonparse';let buffer = '';
const parser = new sax.Parser();parser.onValue = function (value) {if (this.stack.length === 1 && this.key === 'content') {updateUI(value); // 实时渲染 content 字段}
};async function processStream() {const response = await fetch('/api/stream-endpoint', {method: 'POST',body: JSON.stringify({ prompt: '讲个故事' })});const reader = response.body.getReader();const decoder = new TextDecoder();while (true) {const { done, value } = await reader.read();if (done) break;buffer += decoder.decode(value, { stream: true });try {parser.write(buffer);buffer = ''; // 成功解析后清空 buffer} catch (e) {// 忽略不完整 JSON 错误,继续等待更多数据}}parser.close();
}function updateUI(text) {const container = document.getElementById('output');container.textContent += text;
}

技术选型建议

使用场景推荐技术
非流式完整数据fetch, axios, JSON.parse()
流式数据(HTTP SSE)EventSource, fetch + ReadableStream
WebSocket 数据流WebSocket, Socket.IO
JSON 增量解析jsonparse, clarinet
实时 UI 更新requestAnimationFrame, DOM diff, 节流控制

Vue / React 场景优化建议

Vue 示例(使用 ref 控制 DOM)

<template><div id="output">{{ outputText }}</div>
</template><script setup>
import { ref } from 'vue';
const outputText = ref('');function updateUI(text) {outputText.value += text;
}
</script>

React 示例(使用 useStateuseRef

function ChatBox() {const [text, setText] = useState('');const containerRef = useRef(null);function updateUI(chunk) {setText(prev => prev + chunk);setTimeout(() => {containerRef.current.scrollTop = containerRef.current.scrollHeight;}, 0);}return (<div ref={containerRef} style={{ height: '300px', overflowY: 'auto' }}>{text}</div>);
}

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

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

相关文章

thymeleaf直接调用Spring Bean中定义的方法

thymeleaf中可以使用表达式工具对象&#xff0c;通过符号直接调Spring Bean中定义的方法 Spring Bean Component public class InvokeMethodBean {public String fun() { return "fun";} }thymeleaf中调用 <div th:text"${invokeMethodBean.fun()}"&…

虚拟斯德哥尔摩症候群:用户为何为缺陷AI辩护?

当韩国用户美咲连续第七次为虚拟男友的算法错误辩解&#xff1a;“他只是太累了才会说伤人的话”&#xff0c;心理医生在诊断书上写下“数字依赖伴随认知失调”。这种现象并非孤例——斯坦福2024年研究显示&#xff0c;62%长期使用情感AI的用户会主动为系统缺陷寻找合理化解释&…

tryhackme——Abusing Windows Internals(进程注入)

文章目录 一、Abusing Processes二、进程镂空三、线程劫持四、DLL注入五、Memory Execution Alternatives 一、Abusing Processes 操作系统上运行的应用程序可以包含一个或多个进程&#xff0c;进程表示正在执行的程序。进程包含许多其他子组件&#xff0c;并且直接与内存或虚…

[蓝桥杯]密码脱落

密码脱落 题目描述 X 星球的考古学家发现了一批古代留下来的密码。 这些密码是由 A、B、C、D 四种植物的种子串成的序列。 仔细分析发现&#xff0c;这些密码串当初应该是前后对称的&#xff08;也就是我们说的镜像串&#xff09;。 由于年代久远&#xff0c;其中许多种子…

Python绘图库及图像类型

折线图&#xff08;plot&#xff09; 绘图库介绍 Python中绘制折线图的全面指南_python绘制折线图-CSDN博客https://blog.csdn.net/2301_81064905/article/details/139689644 核心作用说明趋势分析揭示数据随时间推移的上升/下降趋势、周期性波动或转折点变化对比在单一图表…

4种常见Python设计爱心创意实现方法

在Python中设计爱心创意有多种实现方式&#xff0c;以下介绍4种常见方法&#xff0c;并附上完整代码&#xff1a; 方法1&#xff1a;使用数学方程绘制&#xff08;Matplotlib&#xff09; ​​原理​​&#xff1a;使用参数方程绘制心形曲线 ​​效果​​&#xff1a;光滑的数…

【Unity】R3 CSharp 响应式编程 - 使用篇(二)

一、通用的事件监听用法 using System;using R3;using UnityEngine;namespace Aladdin.Standard.Observable.Common{public class CommonObservable : MonoBehaviour{// 默认会调用1次public SerializableReactiveProperty<int> serializableReactiveProperty;…

【原理解析】为什么显示器Fliker dB值越大,闪烁程度越轻?

显示器Fliker 1 显示器闪烁现象说明2 Fliker量测方法2.1 FMA法2.2 JEITA法问题答疑&#xff1a;为什么显示器Fliker dB值越大&#xff0c;闪烁程度越轻&#xff1f; 3 参考文献 1 显示器闪烁现象说明 当一个光源闪烁超过每秒10次以上就可在人眼中产生视觉残留&#xff0c;此时…

3.需求分析与测试用例设计方法

设计方法 测试点 定义: 测试时需要考虑的可测试方面&#xff0c;不同公司可能称为"检查点"或其它名称特点: 是需求分析的最后一个环节&#xff0c;用于解决"测哪里"和"怎么测"的问题举例说明: 如同打架时的各种招数&#xff0c;如直接约架、设…

IEC 61347-1:2015 灯控制装置安全标准详解

IEC 61347-1:2015灯控制装置安全标准详解 IEC 61347-1:2015 是国际电工委员会&#xff08;IEC&#xff09;发布的灯控制装置第1部分&#xff1a;通用要求和安全要求的核心标准&#xff0c;为各类照明用电子控制设备设定了全球通用的安全基准。该标准适用于独立式或内置于灯具/…

从 GPT 的发展看大模型的演进

这是一个技术爆炸的时代。一起来看看 GPT 诞生后&#xff0c;与BERT 的角逐。 BERT 和 GPT 是基于 Transformer 模型架构的两种不同类型的预训练语言模型。它们之间的角逐可以从 Transformer 的编码解码结构角度来分析。 BERT&#xff08;Bidirectional Encoder Representatio…

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现

多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现 目录 多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现效果一览基本介绍…

贪心算法应用:集合覆盖问题详解

贪心算法与集合覆盖问题详解 贪心算法在组合优化问题中展现出独特优势&#xff0c;集合覆盖问题&#xff08;Set Cover Problem&#xff09;是其中的经典案例。本文将用2万字全面解析贪心算法在集合覆盖/划分中的应用&#xff0c;涵盖算法原理、正确性分析、Java实现、复杂度证…

MCP:让AI工具协作变得像聊天一样简单 [特殊字符]

想象一下,你正在处理一个项目,需要从A平台查看团队讨论,从B平台获取客户信息,还要在GitHub上检查代码进度。传统做法是什么?打开三个不同的网页,在各个平台间来回切换,复制粘贴数据,最后还可能因为信息分散而遗漏重要细节。 听起来很熟悉?这正是当前工作流程的痛点所…

docker不用dockerfile

好的&#xff01;既然你不想使用 Dockerfile&#xff0c;我们就完全不写 Dockerfile&#xff0c;改用你 Leader 提到的思路&#xff1a; 用基础镜像启动一个容器 → 手动在容器里安装依赖和复制项目 → 保存为新镜像 这个方式更直观&#xff0c;就像“你进入容器自己配置环境&a…

React与Vue核心区别对比

React 和 Vue 都是当今最流行、功能强大的前端 JavaScript 框架&#xff0c;用于构建用户界面。它们有很多相似之处&#xff08;比如组件化、虚拟 DOM、响应式数据绑定&#xff09;&#xff0c;但也存在一些核心差异。以下是它们的主要区别&#xff1a; 1. 核心设计与哲学 Rea…

强化学习-深度学习和强化学习领域

在深度学习和强化学习领域&#xff0c;SFT&#xff08;Supervised Fine-Tuning&#xff09; 和 GRPO&#xff08;可能指 Gradient-based Policy Optimization 或 Reinforcement Learning with Policy Optimization&#xff09;是两种不同的训练范式&#xff0c;常用于模型微调或…

在 ABP VNext 中集成 Serilog:打造可观测、结构化日志系统

&#x1f680; 在 ABP VNext 中集成 Serilog&#xff1a;打造可观测、结构化日志系统 &#x1f4da; 目录 &#x1f680; 在 ABP VNext 中集成 Serilog&#xff1a;打造可观测、结构化日志系统1. 为什么要使用结构化日志&#xff1f; &#x1f914;2. 核心集成步骤 &#x1f6e…

API异常信息如何实时发送到钉钉

#背景 对于一些重要的API&#xff0c;开发人员会非常关注API有没有报错&#xff0c;为了方便开发人员第一时间获取错误信息&#xff0c;我们可以使用插件来将API报错实时发送到钉钉群。 接下来我们就来实操如何实现 #准备工作 #创建钉钉群 如果已有钉钉群&#xff0c;可以跳…

Stone 3D新版本发布,添加玩家控制和生物模拟等组件,增强路径编辑功能,优化材质编辑

后续版本号改为构建日期加小版本&#xff0c;所以最新版本为20250603.01 功能更新如下&#xff1a; 1. 改写fps-controls组件&#xff0c;简化游戏应用的创建&#xff0c;你只需要一个场景glb&#xff0c;然后给Scene节点添加fps-controls组件&#xff0c;即可完成一个第一人…