news 2026/6/23 9:28:54

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/6/17 13:24:17

AI记忆系统完全指南:从入门到精通,让你的大模型不再“失忆“!小白程序员也能秒懂的智能体记忆架构实战

随着 AI Agent 应用场景的持续拓展&#xff0c;智能体面临的任务复杂度与对话历史长度与日俱增。然而&#xff0c;大语言模型&#xff08;LLM&#xff09;的上下文窗口限制、不断攀升的 Token 成本&#xff0c;以及如何让 AI 精准 “记住” 用户偏好与历史交互等问题&#xff0…

作者头像 李华
网站建设 2026/6/17 6:29:53

学霸过目不忘的秘诀

你有没有过这样的经历&#xff1a;明明昨天背过的英语单词&#xff0c;今天听写时在纸上卡了半天&#xff1f;上周老师讲的重点题型&#xff0c;复习时却像从未见过&#xff1f;笔记本越记越厚&#xff0c;知识却像沙子从指缝溜走&#xff1f; 隔壁班那个总笑眯眯的女生&#x…

作者头像 李华
网站建设 2026/6/15 14:51:17

关于UE5只有透视图有显示,其他视图出现空白的问题

在练习UE5的时候&#xff0c;博主切换视图正准备给地编摆放位置时发现顶视图以及其他视图显示全是空白&#xff0c;于是上网查了相关解决问题的办法。以下是百度等浏览器搜索出来的解决办法&#xff1a;这一长串的解决方法让我看得脑壳疼&#xff0c;但是我根据我项目推断&…

作者头像 李华
网站建设 2026/6/17 13:13:05

【干货】Google最新AI Agent报告出炉:小白程序员也能5分钟上手企业级Agent开发!效率直接翻倍,2026年你的工作将被彻底重构!

2026年1月&#xff0c;Google Cloud发布AI Agents趋势报告&#xff0c;基于3466位全球高管调研&#xff0c;提出5条改变企业运作方式的路径。52%使用GenAI的企业已部署Agent&#xff0c;Telus的57000名员工每次AI交互节省40分钟&#xff0c;Danfoss将订单响应从42小时压缩到实时…

作者头像 李华
网站建设 2026/6/21 11:39:35

AWS账单又超了?三招让云成本直降40%,CTO和架构师必看

管理云成本&#xff0c;关键在于优化架构而不仅仅是缩减资源。作为企业的技术负责人&#xff0c;你是否每月都在为那张不断攀升的AWS账单感到头疼&#xff1f;优化成本不只是财务部门的要求&#xff0c;更是衡量技术团队架构能力的重要标尺。本文将分享我们帮助一家电商客户在性…

作者头像 李华