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

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

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


一、四类常见场景总结

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

相关文章:

  • 【产品研究】安克创新公司产品研究
  • 推荐算法八股
  • STM32外部中断(EXTI)以及旋转编码器的简介
  • 【深度学习-Day 22】框架入门:告别数据瓶颈 - 掌握PyTorch Dataset、DataLoader与TensorFlow tf.data实战
  • MongoTemplate常用api学习
  • [手写系列]从0到1开发并上线Edge浏览器插件
  • AJ-Report
  • 深拷贝与浅拷贝的区别?如何手写实现一个深拷贝?
  • 英语写作中“不少于(小于)”no less than替代no fewer than的用法
  • 【文献精读】Explaining grokking through circuit efficiency
  • virtualbox安装扩展工具以支持共享文件夹
  • Foundation Models for Generalist Geospatial Artificial Intelligence论文阅读
  • RTOS:初始化新任务(含源码复杂点解读)
  • MyBatis相关面试题
  • dvwa7——SQL Injection
  • CentOS 7镜像源替换
  • 豆包的图片生成功能基于其底层AI模型,结合了多模态大模型和图像生成技术,其核心逻辑主要包括以下几个部分:
  • mac下通过anaconda安装Python
  • 你的台式机PCIe插槽到底是几条lane
  • 电脑硬盘分几个区好
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Dad Jokes(冷笑话卡片)
  • VueScan:全能扫描,高清输出
  • 《Linux C编程实战》笔记:多路复用
  • vue3:Table组件动态的字段(列)权限、显示隐藏和左侧固定
  • Oracle中的循环——FOR循环、WHILE循环和LOOP循环
  • 免费批量文件重命名软件
  • Spring AI Alibaba + Nacos 动态 MCP Server 代理方案
  • 重新审视自回归语言模型的知识蒸馏
  • 总览四级考试
  • 用AI(Deepseek)做了配色网站-功能介绍【欢迎体验】