首页 > 人工智能 >AI应用消费流式输出

AI应用消费流式输出

来源:互联网 2026-07-31 16:26:13

Fetch结合ReadableStream是浏览器消费流式数据的原生方案,支持POST请求与自定义头,可处理文本、JSON片段等任意格式。通过异步生成器函数调用getReader逐块读取,TextDecoder解码并处理跨块字符边界,配合AbortController实现请求取消。

浏览器端消费流式数据的原生方案:Fetch + ReadableStream

在浏览器端处理流式数据时,Fetch + ReadableStream 是最原生且高效的方案。该方案不依赖任何第三方库,直接调用浏览器内置的 Streams API,具备极高的灵活性。

核心优势

  • 支持 POST 请求,并可自由设置自定义请求头,这在对接后端 API 时尤为关键
  • 对返回数据格式无限制,无论是纯文本、JSON 片段还是其他二进制流,均可正常处理

通用流式请求方法实现

以下代码封装了一个通用流式请求方法,以异步生成器函数形式提供,可直接集成到项目中:

长期稳定更新的攒劲资源: >>>点此立即查看<<<

/**
 * 通用流式请求方法 —— 返回一个异步可迭代对象
 * @param {string} url 请求地址
 * @param {RequestInit} [options] fetch 的配置项(method、headers、body、signal 等)
 * @returns {AsyncGenerator} 异步生成器,每次 yield 一个解码后的文本块
 */
async function* createStreamIterator(url, options = {}) {
  // 1. 发起 fetch 请求
  const response = await fetch(url, options);  // 2. 检查响应状态(可选但建议)
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }  // 3. 获取 reader 和 decoder
  const reader = response.body.getReader();
  const decoder = new TextDecoder('utf-8', { stream: true });  // 4. 逐块读取并 yield 解码后的文本
  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    yield decoder.decode(value, { stream: true });
  }
}// 外部调用
// 结合取消(使用 AbortController)
const controller = new AbortController();
const iterator = createStreamIterator('/api/stream', { signal: controller.signal });// 在需要时取消请求
// controller.abort();for await (const chunk of iterator) {
  // 处理 chunk
}

代码逻辑说明

该方法的执行流程清晰:首先发起 fetch 请求,获取响应对象后通过 response.body.getReader() 获取一个读取器,随后进入循环逐块读取数据。每次读取到的 Uint8Array 字节流,通过 TextDecoder 解码为字符串,并使用 yield 输出。

关键细节:TextDecoder 的 stream 选项

在初始化 TextDecoder 时传入 { stream: true } 选项,告知解码器输入数据是分块到达的流式数据,从而正确处理跨块字符的边界问题,避免出现乱码。

外部调用与取消请求示例

示例代码展示了如何配合 AbortController 实现请求取消。在实际场景中(例如用户手动关闭对话或页面切换),可通过 controller.abort() 及时中断流式请求,有效避免资源浪费。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。