news 2026/4/28 13:49:18

vue3 实时通讯 SSE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vue3 实时通讯 SSE
/** * 原生 EventSource 轻量封装 * 自动重连 & 任意事件监听 * 支持自定义请求头(通过 URL 参数传递 Authorization) */exportdefaultclassSSE{privateurl:string;privatees:EventSource|null;privateretry:number;privateheaders?:Record<string,string>;constructor(url:string,headers?:Record<string,string>){this.url=urlthis.es=nullthis.retry=3000// 重连间隔 msthis.headers=headersthis.connect()}/* 建立连接 */connect():void{// 如果有 headers,将 Authorization 添加到 URL 中(因为 EventSource 不支持自定义 headers)letfinalUrl=this.url;if(this.headers?.Authorization){consttoken=this.headers.Authorization.replace('Bearer ','');constseparator=this.url.includes('?')?'&':'?';finalUrl=`${this.url}${separator}authorization=${encodeURIComponent(token)}`;}this.es=newEventSource(finalUrl)this.es.addEventListener('open',()=>{console.log('[SSE] connected')})this.es.addEventListener('error',()=>{console.log('[SSE] disconnected, retrying...')this.es?.close()setTimeout(()=>this.connect(),this.retry)})}/** * 订阅任意后端事件 * @param {string} event 事件名(与后端 event:xxx 对应) * @param {Function} cb 回调 (data: any) => {} */subscribe<T=any>(event:string,cb:(data:T)=>void):void{this.es?.addEventListener(event,(e:MessageEvent)=>{try{constdata=JSON.parse(e.data)cb(data)}catch(err){console.error('[SSE] parse error',err)}})}/* 手动关闭连接 */close():void{this.es?.close()console.log('[SSE] closed by client')}}
import{defineStore}from'pinia';// 生成唯一 clientIdfunctiongenerateClientId():string{conststored=localStorage.getItem('sse_client_id');if(stored)returnstored;constnewId=`client_${Date.now()}_${Math.random().toString(36).substr(2,9)}`;localStorage.setItem('sse_client_id',newId);returnnewId;}exportconstuseNotificationStore=defineStore('notification',{state:()=>({sse:null,// ...}),actions:{asyncinitSSE(){if(this.sse)return;constclientId=generateClientId();consttoken=localStorage.getItem('token');if(!token){console.error('[NotificationStore] No token found, cannot init SSE');return;}// 建立 SSE 连接,传递 Authorization 请求头constsseUrl=`xxx/xxx/xx?clientId=${clientId}`;this.sse=newSSE(sseUrl,{Authorization:`${token}`});/* 任务状态事件 */this.sse.subscribe<{code:number;data:any;message:string}>('sse_task_status',(payload)=>{console.log('sse监听-----------------------',payload)if(payload.code!==200)return;// payload.data为实时数据// 取出数据放入store});},// 断开 SSE 连接disconnectSSE(){if(this.sse){this.sse.close();this.sse=null;console.log('[NotificationStore] SSE connection closed');}},},});
// 建立连接notificationStore.initSSE()// 断开连接notificationStore.disconnectSSE()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:18:28

震惊!这家酶制剂工厂竟让同行都慌了

震惊&#xff01;这家酶制剂工厂竟让同行都慌了在竞争日益激烈的生物制造领域&#xff0c;一家位于上海的酶制剂生产企业——上海华上翔洋生物&#xff0c;正以其独特的创新模式与卓越的产品力&#xff0c;悄然改变着行业格局&#xff0c;引发了同行的广泛关注与深度思考。引言…

作者头像 李华
网站建设 2026/4/28 4:58:09

如何解决recv被业务阻塞导致的 netlink 消息丢失问题?

先看源码: 现在的问题已经非常清晰了: recv + 业务处理耦合在 select 线程 → netlink buffer 堆积 → 内核丢消息 → VRRP/BFD 状态误判 → 主备抖动/切换(burst(接口 flap / 链路聚合 / 堆叠切换)时必炸 ) 解决办法: 使用队列的方法解决,在 select 线程中:只“快收包…

作者头像 李华
网站建设 2026/4/17 16:10:54

Claude辅助开发:Rust专家利用AI设计新编程语言Rue

为新编程语言命名"Rue"似乎暗示着对项目前景的怀疑&#xff0c;如果将"Rue"理解为"后悔"的话。但是以对Rust和Ruby on Rails贡献闻名的资深软件开发者史蒂夫克拉布尼克表示&#xff0c;这个名称背后有更深层的含义。"Rust这个名字唤起了几种…

作者头像 李华
网站建设 2026/4/17 18:06:56

AI应用架构师的方法论:AI驱动知识管理的“3阶段”落地模型

AI应用架构师的方法论&#xff1a;AI驱动知识管理的“3阶段”落地模型 一、引言&#xff1a;为什么需要AI驱动的知识管理&#xff1f; 在数字化转型的浪潮中&#xff0c;企业的核心竞争力早已从“资源占有”转向“知识创造与利用”。然而&#xff0c;传统知识管理&#xff08…

作者头像 李华
网站建设 2026/4/27 5:20:43

吐血推荐专科生必用10款一键生成论文工具

吐血推荐专科生必用10款一键生成论文工具 专科生论文写作工具测评&#xff1a;2026年榜单深度解析 随着高校教育的不断深化&#xff0c;专科生在学术写作中的需求日益增长。然而&#xff0c;面对论文选题、文献综述、格式排版等重重挑战&#xff0c;许多学生往往感到力不从心。…

作者头像 李华
网站建设 2026/4/23 16:39:30

word将所选内容超链接为文章其他内容

word版本&#xff1a;word 2016 总体步骤: 选中需要链接的内容。 选择插入------书签 为书签起一个名字&#xff0c;并选择添加 选中索引位置&#xff1a; 选择插入---------链接---------插入链接 选中本文档中的位置---选择自己的书签&#xff0c;然后点击确定。 正常字体就…

作者头像 李华