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

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)

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

相关文章:

  • #HarmonyOS:软件安装window和mac预览Hello World
  • Java中富文本转markdown
  • MySQL 数据库如何实现 XA 规范?
  • 开发一款短剧视频小程序软件多少钱?
  • 道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式
  • Canvas鼠标画线
  • 基于Python的PyGame的俄罗斯方块游戏设计与实现
  • 算法leetcode|91. 解码方法(rust重拳出击)
  • 信号完整性分析
  • ChatGPT一周年,奥特曼官宣 OpenAI 新动作!
  • [MTK]安卓8 ADB执行ota升级
  • 简单实现Spring容器(二)
  • uniapp 显示文件流图片
  • 利用ElementUI配置商品的规格参数
  • Spring Security6 快速实战
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android系统模拟器绘制实现概述
  • CSS盒模型深入
  • DataBase in Android
  • GitUp, 你不可错过的秀外慧中的git工具
  • go append函数以及写入
  • Idea+maven+scala构建包并在spark on yarn 运行
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java教程_软件开发基础
  • Python学习之路13-记分
  • select2 取值 遍历 设置默认值
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • WebSocket使用
  • Yii源码解读-服务定位器(Service Locator)
  • 简单实现一个textarea自适应高度
  • 如何用vue打造一个移动端音乐播放器
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 积累各种好的链接
  • #Ubuntu(修改root信息)
  • $.ajax中的eval及dataType
  • $forceUpdate()函数
  • (libusb) usb口自动刷新
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (三分钟)速览传统边缘检测算子
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)鸿鹄云架构一服务注册中心
  • (转)shell调试方法
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .Net小白的大学四年,内含面经
  • :中兴通讯为何成功