chatGPT流式输出前端实现fetch、SSE、websocket
创始人
2024-12-28 06:37:48
0

一、fetch实现stream

fetch 本身不直接支持流式输出,但你可以使用 ReadableStream 和 TextDecoder 等 Web Streams API 来实现类似的效果。

function streamOutput(msg) {   // 发送 POST 请求   fetch('url', {     method:"POST",     body:JSON.stringify({ "content": msg}),     timeout: 0,     dataType:"text/event-stream",     headers:{       "Content-Type":"application/json"     },   }).then(response => {     // 检查响应是否成功     if (!response.ok) {       throw new Error('Network response was not ok');     }     // 返回一个可读流     return response.body;   }).then(body => {     disableLoading();     const reader = body.getReader();     // 读取数据流     function read() {       return reader.read().then(({ done, value }) => {         // 检查是否读取完毕         if (done) {           console.log('已传输完毕');           return;         }         // 处理每个数据块         console.log('收到的数据:', value);                  // 继续读取下一个数据块         read();       });     }     // 开始读取数据流     read();   }).catch(error => {console.error('Fetch error:', error);}); } 

二、SSE实现(只支持GET请求)

在 SSE 中,浏览器通过发送 HTTP GET 请求到服务器上特定的 SSE 端点(endpoint),然后服务器通过该连接发送事件(event)和相关数据到客户端,故SSE 主要使用 GET 请求。EventSource不支持发送请求头,如果需要发送请求头则要用EventSourcePolyfill。

在使用EventSourcePolyfill前需要引入 Server-Sent Events (SSE) 的 JavaScript 库。

引入方式一:npm或yarn

npm install event-source-polyfill 
yarn add event-source-polyfill 

在js文件中引入

import EventSource from 'event-source-polyfill'; 

引入方式二:
eventsource下载仓库:https://github.com/Yaffle/EventSource
注意:进入src文件下载所需eventsource.jseventsource.min.js文件,引入时注意路径,如果是jsp文件用绝对路径

 
function streamOutput() { 	  // 创建 EventSourcePolyfill连接,如果不需要发送请求头可以使用EventSource即可 	const eventSource = new EventSourcePolyfill('url',{ 		headers:{       		"Content-Type":"application/json"     	} 	}); 	 	// 处理 SSE 消息 	eventSource.onmessage = function (event) { 	  console.log('接收SSE的消息:', event.data); 	  // 在这里处理接收到的流式数据 	}; 	 	// 处理 SSE 连接打开事件 	eventSource.onopen = function (event) { 	  console.log('SSE连接完成:', event); 	}; 	 	// 处理 SSE 连接关闭事件 	eventSource.onclose = function (event) { 	  console.log('SSE连接关闭:', event); 	}; 	 	// 处理 SSE 错误事件 	eventSource.onerror = function (error) { 	  console.error('SSE EventSource error:', error); 	}; } 

三、websocket实现(url必须为ws或wss开头的接口)

WebSocket 是一种全双工通信协议,允许客户端和服务器之间进行实时的双向通信,并且支持POST请求。但是值得注意的是WebSocket只支持wswss开头的接口。WebSocket 握手时并没有提供直接设置请求头的标准方法,它的握手阶段是由浏览器自动处理的,因此你不能直接在创建 WebSocket 连接时设置请求头,但可以通过通过 URL 参数传递的方式传递信息。

function streamOutput(msg) { 	 const socket = new WebSocket('url'); 	 	// 连接打开时触发 	socket.addEventListener('open', event => { 	  console.log('WebSocket连接完成:', event); 	 	  // 处理接收到的消息 	  socket.addEventListener('message', event => { 	    console.log('接收消息:', event.data); 	    // 在这里处理接收到的流式数据 	  }); 	}); 	 	// 连接关闭时触发 	socket.addEventListener('close', event => { 	  console.log('WebSocket连接关闭:', event); 	}); 	 	// 处理错误时触发 	socket.addEventListener('error', error => { 	  console.error('WebSocket error:', error); 	}); } 

相关内容

热门资讯

一分钟内幕!科乐吉林麻将系统发... 一分钟内幕!科乐吉林麻将系统发牌规律,福建大玩家确实真的是有挂,技巧教程(有挂ai代打);所有人都在...
一分钟揭秘!微扑克辅助软件(透... 一分钟揭秘!微扑克辅助软件(透视辅助)确实是有挂(2024已更新)(哔哩哔哩);1、用户打开应用后不...
五分钟发现!广东雀神麻雀怎么赢... 五分钟发现!广东雀神麻雀怎么赢,朋朋棋牌都是是真的有挂,高科技教程(有挂方法)1、广东雀神麻雀怎么赢...
每日必看!人皇大厅吗(透明挂)... 每日必看!人皇大厅吗(透明挂)好像存在有挂(2026已更新)(哔哩哔哩);人皇大厅吗辅助器中分为三种...
重大科普!新华棋牌有挂吗(透视... 重大科普!新华棋牌有挂吗(透视)一直是有挂(2021已更新)(哔哩哔哩)1、完成新华棋牌有挂吗的残局...
二分钟内幕!微信小程序途游辅助... 二分钟内幕!微信小程序途游辅助器,掌中乐游戏中心其实存在有挂,微扑克教程(有挂规律)二分钟内幕!微信...
科技揭秘!jj斗地主系统控牌吗... 科技揭秘!jj斗地主系统控牌吗(透视)本来真的是有挂(2025已更新)(哔哩哔哩)1、科技揭秘!jj...
1分钟普及!哈灵麻将攻略小,微... 1分钟普及!哈灵麻将攻略小,微信小程序十三张好像存在有挂,规律教程(有挂技巧)哈灵麻将攻略小是一种具...
9分钟教程!科乐麻将有挂吗,传... 9分钟教程!科乐麻将有挂吗,传送屋高防版辅助(总是存在有挂)1、完成传送屋高防版辅助透视辅助安装,帮...
每日必看教程!兴动游戏辅助器下... 每日必看教程!兴动游戏辅助器下载(辅助)真是真的有挂(2025已更新)(哔哩哔哩)1、打开软件启动之...