上一篇
html保存流数据
- 行业动态
- 2025-05-12
- 9
可通过EventSource或WebSocket接口接收服务端流数据,结合JavaScript动态解析并存储至IndexedDB/LocalStorage,需注意二进制数据处理及浏览器兼容性,建议采用Blob对象分段缓存大体积流媒体
获取流数据的方法
使用 WebSocket
- 原理:建立双向通信通道,实时接收服务器推送的数据。
- 适用场景:实时聊天、股票行情、游戏等。
- 示例代码:
const socket = new WebSocket('ws://example.com/stream'); socket.onmessage = (event) => { const data = JSON.parse(event.data); saveData(data); };
使用 Server-Sent Events (SSE)
- 原理:单向推送事件流,服务器主动发送数据到客户端。
- 适用场景:实时更新日志、通知推送等。
- 示例代码:
const eventSource = new EventSource('http://example.com/events'); eventSource.onmessage = (event) => { const data = JSON.parse(event.data); saveData(data); };
使用 Fetch API 的流处理
- 原理:通过
ReadableStream
逐步读取响应体。 - 适用场景:大文件分片下载、流式数据处理。
- 示例代码:
fetch('http://example.com/stream') .then(response => response.body) .then(stream => { const reader = stream.getReader(); reader.read().then(({ value, done }) => { if (!done) { const data = new TextDecoder().decode(value); saveData(JSON.parse(data)); reader.read().then(processStream); // 递归读取 } }); });
处理流数据的逻辑
步骤 | 操作 | 说明 |
---|---|---|
解析数据 | 将流中的原始数据(如 JSON、文本)转换为可操作的对象。 | JSON.parse(event.data) 。 |
数据清洗 | 过滤无效数据或补充缺失字段。 | if (data.temperature !== null) { ... } 。 |
格式化存储 | 将数据转换为适合存储的格式(如字符串化)。 | JSON.stringify(data) 。 |
保存到本地存储
使用 localStorage
- 特点:简单易用,但容量限制(约 5MB),仅支持字符串。
- 示例代码:
function saveData(data) { const existingData = localStorage.getItem('streamData') || '[]'; const allData = JSON.parse(existingData); allData.push(data); localStorage.setItem('streamData', JSON.stringify(allData)); }
使用 IndexedDB
- 特点:支持大容量和复杂数据结构,需使用事务。
- 示例代码:
const db = new Dexie('streamDB'); db.version(1).stores({ stream: '++id,data' }); function saveData(data) { db.stream.add({ data }); }
存储方式 | 容量限制 | 数据类型 | 适用场景 |
---|---|---|---|
localStorage | 5MB | 字符串 | 小规模临时数据 |
IndexedDB | 数GB | 对象、二进制 | 大规模持久化数据 |
常见问题与解答
问题 1:如何处理高频流数据导致的性能问题?
解答:
- 节流/防抖:限制数据处理的频率(如每秒处理一次)。
- 批量存储:将多条数据合并后一次性存储(如每 10 条存一次)。
- 内存缓冲:先用数组缓存数据,定时写入存储。
示例代码:let buffer = []; function saveData(data) { buffer.push(data); if (buffer.length >= 10) { localStorage.setItem('streamData', JSON.stringify(buffer)); buffer = []; } }
问题 2:如何确保流数据的完整性和顺序?
解答:
- 添加时间戳:每条数据附带服务器时间戳,存储时按时间排序。
- 事务机制:使用
IndexedDB
的事务确保原子性操作。 - 校验机制:通过数据签名或哈希值验证数据未被改动。
示例代码:function saveData(data) { const existingData = JSON.parse(localStorage.getItem('streamData') || '[]'); existingData.push({ ...data, timestamp: Date.now() }); existingData.sort((a, b) => a.timestamp b.timestamp); localStorage.setItem('streamData', JSON.stringify(existingData