当前位置: 首页 > news >正文

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

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


一、四类常见场景总结

类型数据完整性是否实时渲染适用技术/方法
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.lqws.cn/news/107857.html

相关文章:

  • 安全月报 | 傲盾DDoS攻击防御2025年5月简报
  • C#面向对象实践项目--贪吃蛇
  • 第2章_Excel_知识点笔记
  • 【Zephyr 系列 6】使用 Zephyr + BLE 打造蓝牙广播与连接系统(STEVAL-IDB011V1 实战)
  • C++ TCP传输心跳信息
  • qwen大模型在进行词嵌入向量时,针对的词表中的唯一数字还是其他的?
  • Java程序员学从0学AI(四)
  • 【数据结构 -- B树】
  • JS手写代码篇---手写call函数
  • 【Harmony OS】作业五 数据存储
  • Python趣学篇:Pygame重现《黑客帝国》数字雨
  • Unity UI 性能优化--Sprite 篇
  • Rust 数据类型
  • 初始化已有项目仓库,推送远程(Git)
  • recipes中声明 DEPENDS += “virtual/kernel“ 的效果
  • SMART原则讲解
  • 物联网数据归档之数据存储方案选择分析
  • 大疆无人机的二次开发
  • 【结构型模式】装饰器模式
  • Matlab数值计算
  • [手写系列]从0到1开发并上线Edge浏览器插件
  • Qt 事件传递的完整流程
  • 无人机巡检智能边缘计算终端技术方案‌‌——基于EFISH-SCB-RK3588工控机/SAIL-RK3588核心板的国产化替代方案‌
  • QT实现动画翻转效果
  • 群晖 NAS 如何帮助培训学校解决文件管理难题
  • Windows下将Nginx设置注册安装为服务方法!
  • 工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线
  • 2024-2025-2-《移动机器人设计与实践》-复习资料-1-7
  • 当 AI 超越人类:从技术突破到文明拐点的 2025-2030 年全景展望
  • 累乘法求数列的通项公式