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

使用 Fetch + Streams 处理流式响应(Streaming Response)

使用 Fetch + Streams 处理流式响应(Streaming Response)

📌 一、用途说明

该代码用于从一个支持流式响应的服务器接口读取数据,一般用于:

  • 与 OpenAI、ChatGPT 等模型的实时对话接口
  • 音视频分片下载
  • Server-Sent Events(SSE)或其他长连接传输
  • 后端支持 chunked transfer encoding 的接口

🧩 二、完整代码

try {const response = await fetch("http://127.0.0.1:8000/AI/chat", {method: "POST",headers: {"Content-Type": "application/json"},body: JSON.stringify({ query: content })});const reader = response.body.getReader();const decoder = new TextDecoder();let done = false;let result = '';while (!done) {const { value, done: doneReading } = await reader.read();done = doneReading;let resultString = decoder.decode(value, { stream: true });result += resultString;console.log(resultString);}
} catch (error) {console.error("请求失败:", error);
}

🔍 三、逐项详解

代码片段说明
fetch(...)使用 Fetch API 发起 POST 请求
headers: { "Content-Type": "application/json" }声明请求体是 JSON 类型
JSON.stringify({ query: content })将 JavaScript 对象转换为 JSON 字符串
response.body.getReader()获取 ReadableStream 的读取器(Reader)
TextDecoder()创建一个用于将字节流解码为文本的对象
reader.read()异步读取下一段数据,返回 { value, done }
decoder.decode(value, { stream: true })解码字节为字符串,stream 选项表示多段解码
result += resultString可选,用于累积最终结果
console.log(resultString)打印每次读取的结果,模拟实时输出

🔁 四、类似用法对比

✅ 示例 1:读取流式 JSON 响应

const reader = response.body.getReader();
const decoder = new TextDecoder();
let buffer = "";while (true) {const { value, done } = await reader.read();if (done) break;buffer += decoder.decode(value, { stream: true });try {const json = JSON.parse(buffer);console.log("解析成功:", json);break;} catch (e) {// 继续读取直到 JSON 完整}
}

✅ 示例 2:处理 SSE(Server-Sent Events)事件流

const response = await fetch("/sse");
const reader = response.body.getReader();
const decoder = new TextDecoder();
let partial = "";while (true) {const { value, done } = await reader.read();if (done) break;partial += decoder.decode(value, { stream: true });const events = partial.split("\n\n");for (let i = 0; i < events.length - 1; i++) {const event = events[i];if (event.startsWith("data:")) {const data = event.replace("data: ", "");console.log("收到事件:", data);}}partial = events[events.length - 1];
}

✅ 示例 3:Blob/视频流读取

const response = await fetch("/video");
const reader = response.body.getReader();
let chunks = [];while (true) {const { value, done } = await reader.read();if (done) break;chunks.push(value);
}const blob = new Blob(chunks, { type: "video/mp4" });
document.querySelector("video").src = URL.createObjectURL(blob);

🧠 五、补充知识:TextDecoder 的作用

TextDecoder 是浏览器提供的用于解码 Uint8Array 字节为字符串的 API。

常用方法:

const decoder = new TextDecoder("utf-8");
decoder.decode(Uint8Array, { stream: true });
  • { stream: true }:允许将未完成的字节块保留到下一次调用,防止字符乱码或丢失。

🧰 六、其他工具库推荐

  • react-streaming
  • readable-stream(Node.js)
  • eventsource-parser(处理 SSE)

✅ 七、参考文档

  • MDN: fetch
  • MDN: ReadableStream
  • MDN: TextDecoder
http://www.dtcms.com/a/223021.html

相关文章:

  • 【空间光学系统与集成微纳光子学系统简介】
  • Proteus寻找元器件(常见)
  • 带你手写React中的useReducer函数。(底层实现)
  • ESP8266远程控制:实现网络通信与设备控制
  • Nginx网站服务:从入门到LNMP架构实战
  • 日志技术-LogBack、Logback快速入门、Logback配置文件、Logback日志级别
  • WebFuture:设置不自动删除操作日志
  • 26 C 语言函数深度解析:定义与调用、返回值要点、参数机制(值传递)、原型声明、文档注释
  • 万兴PDF手机版
  • 前端面试题目-高频问题集合
  • Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速
  • 【目标检测】【AAAI-2022】Anchor DETR
  • 【孙悟空喝水】2022-2-7
  • 引进白光干涉仪管控微流控芯片形貌,性能大幅提升
  • 延迟复制与主从延迟监控指南
  • @Docker Compose 部署 Prometheus
  • Vue3 + VTable 高性能表格组件完全指南,一个基于 Canvas 的高性能表格组件
  • 飞牛fnNAS的Docker应用之迅雷篇
  • 展会聚焦丨漫途科技亮相2025西北水务博览会!
  • Ubuntu系统下可执行文件在桌面单击运行教程
  • 企业信息化集成方案:聚水潭·奇门数据对接金蝶云星空
  • 【Linux 学习计划】-- 进程状态 | 进程运行、阻塞和挂起的本质 | 并行、并发与进程切换 | 进程优先级
  • 重拾Scrapy框架
  • AC220V整流滤波电路Multisim仿真
  • 【python基础知识】列表简介
  • golang 基于redis实现集群中的主实例选举
  • leetcode动态规划—打家劫舍系列
  • 信创国产化
  • vue3实现鼠标悬浮div动画效果
  • espefuse.py烧录MAC地址