vue3 中使用 sse 最佳实践,封装工具

在这里插入图片描述

工具

// 接受参数
export interface SSEChatParams {url: string,// sse 连接onmessage: (event: MessageEvent) => void,// 处理消息的函数onopen: () => void,// 建立连接触发的事件finallyHandler: () => void,// 相当于 try_finally 中的 finally 部分,不管出现异常或者关闭必然会执行的代码块
}class SSEService {private eventSource: EventSource | null = null;private finallyHandler: (() => void) | undefined;// 建立连接connect(sseChatParams: SSEChatParams) {this.finallyHandler = sseChatParams.finallyHandler;this.eventSource = new EventSource(sseChatParams.url);if (sseChatParams.onopen != null) {this.eventSource.onopen = sseChatParams.onopen;}else{this.eventSource.onopen = () => {console.log('SSE 连接已开启');};}if (sseChatParams.onmessage != null) {this.eventSource.onmessage = sseChatParams.onmessage;} else {this.eventSource.onmessage = (event) => {console.log('收到消息:', event.data);};}this.eventSource.onerror = (error) => {if (this.eventSource?.readyState === EventSource.CLOSED) {console.log("SSE 连接已关闭");} else {console.error("SSE 错误:", error);}sseChatParams.finallyHandler();};}// 关闭连接disconnect() {if (this.eventSource) {this.eventSource.close();console.log("关闭 sse 连接")if (this.finallyHandler != null) {this.finallyHandler();}}}
}export const sseService = new SSEService();

使用

我在我代码中是这样使用的,就这么简单

const onopen = () => {console.log("建立无敌 sse 连接成功")
}
// 建立连接
let sseChatParams: SSEChatParams = {onopen,url: import.meta.env.VITE_GLOB_API_URL + 'sse/createConnect?clientId=' + userStore.getSseClientId(),onmessage: (event: MessageEvent) => {// 收到消息console.log('收到消息xsssx:', event.data);let chunk = event.data;if (chunk === '[DONE]') {sseService.disconnect()state.imageList = []chatGuide(chatStore.activeChatId).then(resp => {chatGuideList.value = resp.data.guideListscrollViewBottom()})return}chunk = JSON.parse(chunk)if (chunk.type === 'error') {errorText = chunk.contentconsole.log("errorText", errorText);updateChatData(errorText)return;}chunk = chunk.content;if (!chunk) {return;}lastText = lastText + chunk// 更新聊天数据源中的对话updateChatData(lastText)},finallyHandler: () => {console.log("finallyHandler操作")sessionStatus.value = 0inputDisabled.value = falsedataSources.value[dataSources.value.length - 1].loading = falseloading.value = falseif (!isMobile.value) {// 聚焦输入框inputRef.value?.focus()}}
};
sseService.connect(sseChatParams)

另外你可能还需要增加一下关闭触发时机

// 当组件从 DOM 中卸载前执行的操作
onUnmounted(() => {sseService.disconnect()
})

这里需要提一嘴,关于 sse 中的 onopen 触发时机

当你和服务器建立 sse 连接的时候,如果后端没有通过 sse 返回给你消息的话,那么前端浏览器大概率是不会触发 onopen 事件。

所以当与后端建立连接后要注意咯~


最后介绍一下自己的网站术士 AI:术士AI 2.0 (shushiai.com)

有兴趣用用玩玩,最好也支持一下,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习(2)回归

0.前提 上一期,我们简单的介绍了一些有关机器学习的内容。学习机器学习的最终目的是为了服务我未来的毕设选择之一——智能小车,所以其实大家完全可以根据自己的需求来学习这门课,我做完另一辆小车后打算花点时间去进行一次徒步行&#xff0…

C++现代模板元编程

序 个人发现很多国外的大佬的演讲或者文章都很不错,但是鲜有人来进行分享,届后本人会时不时拿一些看起来很好的东西来给大家分享,主要也是搬运,不过也省去了大家去读英文的麻烦,同时文章中也会参杂着一些自己的见解。…

游戏mod制作--引擎与解包

摘要 游戏mod的制作过程第一步就是需要将原始的游戏工程文件进行解包,得到相应的资源文件(贴图,音频,事件,模型甚至源代码等),这个时候下一步就是需要将解包出来的文件进行分类索引&#xff0c…

服务器内存使用率高的原因及解决方法_Maizyun

服务器内存使用率高的原因及解决方法 在服务器运行过程中,内存使用率过高可能会引发一系列问题,如性能下降、应用程序崩溃等。本文将深入探讨服务器内存使用率高的原因,并提出相应的解决方法。 一、内存使用率高的原因 应用程序缺陷&#…

20:kotlin 类和对象 --泛型(Generics)

类可以有类型参数 class Box<T>(t: T) {var value t }要创建类实例&#xff0c;需提供类型参数 val box: Box<Int> Box<Int>(1)如果类型可以被推断出来&#xff0c;可以省略 val box Box(1)通配符 在JAVA泛型中有通配符?、? extends E、? super E&…

25. K 个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

自媒体原创改写工具,自媒体首发改写软件

自媒体平台已成为许多创作者表达观点、分享知识和积累影响力的关键渠道。创作是需要技巧和经验的。本文将分享一些自媒体文章改写技巧&#xff0c;并推荐一系列优秀的自媒体文章改写工具&#xff0c;帮助您提升创作效率&#xff0c;创作出更优秀的文章。 自媒体文章改写技巧 …

Backend - Django makemigrations

目录 一、迁移命令 &#xff08;一&#xff09;前提 &#xff08;二&#xff09;生成迁移文件 &#xff08;三&#xff09;执行迁移 二、迁移问题 1. Error&#xff1a;No changes detected 2. Error&#xff1a;You are trying to add a non-nullable field XXX to XXX…

[读论文]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

github: GitHub - Nota-NetsPresso/BK-SDM: A Compressed Stable Diffusion for Efficient Text-to-Image Generation [ICCV23 Demo] [ICML23 Workshop] ICML 2023 Workshop on ES-FoMo 简化方式 蒸馏方式&#xff08;训练Task蒸馏outKD-FeatKD&#xff09; 训练数据集 评测指标…

在intelliJ spring boot gradle插件3.2.0中未找到匹配的变量

我正在尝试使用spring启动Gradle插件的版本3.2.0。这是我的build.gradle文件&#xff1a; plugins {id javaid org.springframework.boot version 3.2.0id io.spring.dependency-management version 1.1.4 }group com.yaxin version 0.0.1-SNAPSHOTjava {sourceCompatibilit…

GPIO的使用--时钟使能含义--代码封装

目录 一、时钟使能的含义 1.为什么要时钟使能&#xff1f; 2.什么是时钟使能&#xff1f; 3.GPIO的使能信号&#xff1f; 二、代码封装 1.封装前完整代码 2.封装结构 封装后代码 led.c led.h key.c key.h main.c 一、时钟使能的含义 1.为什么要时钟使能&#xff1f…

Python开发运维:Python 3.8 常用标准库

目录 一、理论 1.Python3.8 标准库 2.常用标准库 二、问题 1.Python 正则表达式如何实现 一、理论 1.Python3.8 标准库 &#xff08;1&#xff09;官网 Python 标准库 — Python 3.8.17 文档 &#xff08;2&#xff09;其他版本下拉列表查询 2.常用标准库 &#xff0…

MySQL笔记-第01章_数据库概述

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第01章_数据库概述1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库…

JVM参数配置推荐

JVM配置建议 参数 备注/参数释义 规范 JVM GC方法 ParallelGC&#xff1a;1.8默认&#xff0c;高吞吐量&#xff0c;响应时间不敏感 CMS&#xff1a;响应优先&#xff0c;堆内存8G以下优先选择 G1&#xff1a;响应优先&#xff0c;堆内存8G及以上选择 C端应用&#xff1a;…

微积分中值定理的双存在值证明问题@寻找辅助函数证明中值问题

文章目录 abstract微积分中值定理的双存在值证明题举例综合使用积分中值定理和微分中值定理例 双中值问题构造辅助函数法综合小结 abstract 微积分中值定理的双存在值证明问题寻找辅助函数证明中值问题 微积分中值定理的双存在值证明题举例 综合使用积分中值定理和微分中值定…

Linux--网络编程-ftp(TCP)网络通信-文件交互

项目要求&#xff1a;实现以下内容 远程控制&#xff1a; 1、查看服务器当前路径文件 ls 3、进入、退出服务器文件夹 cd 4、上传文件到服务器 put xxx 本地控制&#xff1a; 1、查看本地&#xff08;客户端&#xff09;文件 lls 2、进入客户端文件夹 lcd 3、获取服务器的文件…

音频录制软件哪个好?帮助你找到最合适的一款

音频录制软件是日常工作、学习和创作中不可或缺的一部分。选择一个适合自己需求的录音软件对于确保音频质量和提高工作效率至关重要。可是您知道音频录制软件哪个好吗&#xff1f;本文将深入探讨两种常见的音频录制软件&#xff0c;通过详细的步骤指南&#xff0c;帮助您了解它…

编写Java应用程序,输出满足1+2+3+……+n<8888的最大正整数n。

源代码&#xff1a; public class Main { public static void main(String[] args) { int i 1; int sum 0; for(i 1;;i){ sum i; if (sum >8888) break; } System.out.println(i-1); } } 实验运行截图&#xff1a;

数组实现循环队列(新增一个空间)

目录 一、前言 1.如何实现循环&#xff1f; 2.如何判断队列为空&#xff1f; 3.如何判断队列为满&#xff1f; 二、循环队列的结构定义 三、循环队列的创建及其初始化 四、入队 五、出队 六、取队头元素 七、取队尾元素 八、判空 九、判满 十、销毁队列 一、前言 …

【滑动窗口】LeetCode2953:统计完全子字符串

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本题其它解法 【离散差分】LeetCode2953:统计完全子字符串 题目 给你一个字符串 word 和一个整数 k 。 如果 word 的一个子字符串 s 满足以下条件&#xff0c;我们称它是 完全字符串&#xff1a; s 中每个字符…