当前位置: 首页 > 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

相关文章:

  • 【空间光学系统与集成微纳光子学系统简介】
  • 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系统下可执行文件在桌面单击运行教程
  • dede手机医院网站模板下载/百度搜索引擎排名
  • 北京网站备案核验单/百度企业网盘
  • 做视频点播网站要多少带宽/金华百度seo
  • 建立传媒公司网站/网络优化师是什么工作
  • 浙江 网站建设/百度一下的网址
  • 专门做黄漫的网站/免费发广告网站