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

前端怎么用 EventSource并配置请求头及加参数(流式数据)

这里写目录标题

  • 一、EventSourcePolyfill
  • 二、直接上代码

EventSource 接口是 web 内容与服务器发送事件通信的接口。
一个 EventSource 实例会对 HTTP 服务器开启一个持久化的连接,以 text/event-stream 格式发送事件,此连接会一直保持开启直到通过调用 EventSource.close() 关闭。
EventSource 服务器发送事件是单向的。数据消息只能从服务端发送到客户端。

一、EventSourcePolyfill

EventSourcePolyfill 是EventSource封装的一个方法,EventSourcePolyfill 可以配置请求头

// 安装npm install event-source-polyfill --save//引用
import { EventSourcePolyfill } from "event-source-polyfill";

二、直接上代码

 sendRequest(messageId, content, questionId, questionType) {const innerIndex = this.messageList.length - 1;const aiToken = JSON.parse(localStorage.getItem('token'));let that = this;let eventSource;if (questionId) {eventSource = new EventSourcePolyfill(`${process.env.VUE_APP_WEB_API}/url...........?f_rnd=${new Date().getTime()}&message_id=${messageId}&question_id=${questionId}&stream=true`,{headers: {'Content-Type': 'text/event-stream',aiToken: aiToken,accept: '*/*','Cache-Control': 'no-cache',Connection: 'keep-alive',// 'cache-control': 'max-age=0',},});} else {eventSource = new EventSourcePolyfill(`${process.env.VUE_APP_WEB_API}/ai_assistant_chatdoc/receive_message?f_rnd=${new Date().getTime()}&message_id=${messageId}&stream=true`,{headers: {'Content-Type': 'text/event-stream',aiToken: aiToken,accept: '*/*','Cache-Control': 'no-cache',Connection: 'keep-alive',},});}//open:订阅成功(和后端连接成功)eventSource.onopen = function (e) {console.log(e, '连接刚打开时触发');};//message:后端返回信息,格式可以和后端协商that.messageQueue = []; //整个流式数据this.processing = false; //判断是否返回数据中let resultWord = '';let rowData = {};eventSource.onmessage = function (e) {const data = JSON.parse(e.data) || {}; //这里后端返回的是字符串所以目前我这边有转换console.log(data, data.data.content, Date.now());if (data.code === 200) {that.loading = false;that.scrollFlag = false;if (data.data.content === '[DONE]') { //流式结束了rowData = data.data;}that.messageQueue.push(data.data.content);if (that.processing) return;that.processing = true; (async function processMessages() {while (that.processing) {// 改为无限循环let message;if (that.messageQueue.length > 0) {message = that.messageQueue.shift();if (message === '[DONE]') {that.receiveMsg.source = rowData.source;that.receiveMsg.sourceEdit = rowData.is_edit;that.$set(that.messageList[innerIndex], 'message_id', rowData.message_id);that.requestRecomme(messageId, innerIndex);} else {resultWord += message;console.log(resultWord, 'resultWord');that.$set(that.messageList, innerIndex, {type: 'right',session_id: data.data.session_id,message_id: data.data.message_id,reply_id: data.data.reply_id,message: resultWord,source: [],sourceEdit: [],question: [],});that.receiveMsg = that.messageList[innerIndex];that.chcekScroll();that.executeScroll(!that.scrollFlag);}await new Promise(resolve => setTimeout(resolve, 30)); //30毫秒读取一下message} else {that.processing = false;await new Promise(resolve => setTimeout(resolve, 800)); //如果读取速度大于流式返回速度就等一下}if (that.messageQueue.length === 0 && message === '[DONE]') {break;}}that.processing = false;})();}};//  error:错误(可能是断开,可能是后端返回的信息)eventSource.onerror = function (e) {console.log(e, '连接无法打开时触发');eventSource.close(); // 关闭连接setTimeout(() => {}, 5000);};},

链接: https://blog.csdn.net/weixin_49066399/article/details/138713416

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Hyperf 安装,使用,
  • 单一责任原则
  • CentOS7上安装RabbitMQ
  • 正则表达式入门:Python ‘ re ‘ 模块详解
  • C++内存泄漏--**关于“异常0xc0000005 读取的位置 0xDDDDDDDD时发生冲突”
  • Flask详细教程
  • <STC32G12K128入门第十步>USB HID键盘
  • 5年前端面试之路
  • 【LeetCode Cookbook(C++ 描述)】一刷二叉树综合(下)
  • “AI+Security”系列第2期(三):面向LLM(大语言模型)的漏洞挖掘与对齐防御研究
  • 橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码
  • YOLOv10:实时端到端目标检测
  • Linux驱动学习之点灯(一)
  • SVN限制提交文件必须填写日志---实操笔记
  • 【杂乱笔记】Kmp字符串匹配算法
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 0x05 Python数据分析,Anaconda八斩刀
  • dva中组件的懒加载
  • es6--symbol
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • gf框架之分页模块(五) - 自定义分页
  • JAVA之继承和多态
  • Markdown 语法简单说明
  • MySQL的数据类型
  • ng6--错误信息小结(持续更新)
  • PHP 的 SAPI 是个什么东西
  • Python 基础起步 (十) 什么叫函数?
  • SpiderData 2019年2月13日 DApp数据排行榜
  • web标准化(下)
  • windows下如何用phpstorm同步测试服务器
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 推荐一个React的管理后台框架
  • 微信小程序实战练习(仿五洲到家微信版)
  • 选择阿里云数据库HBase版十大理由
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • %check_box% in rails :coditions={:has_many , :through}
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (NSDate) 时间 (time )比较
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)原生js案例之数码时钟计时
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (算法)区间调度问题
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)h264中avc和flv数据的解析
  • (转)socket Aio demo
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .htaccess 强制https 单独排除某个目录
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net中我喜欢的两种验证码
  • .so文件(linux系统)