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

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()

http://www.jsqmd.com/news/194575/

相关文章:

  • A-68 语音处理模组 —— 波束成型 + 双麦降噪,全场景音频交互升级方案
  • LangGraph 是什么?一文秒懂且通俗易懂!
  • HISTCMD 介绍
  • typora快速下载(简单易学)
  • Redis入门篇001_Redis简介与特性
  • mineru离线环境解析文档报“Connection to paddleocr.bj.bcebos.com timed out.”
  • C++ 入门第一课:命名空间、IO 流、缺省参数与函数重载全解析 - 实践
  • telnet远程登陆与管理
  • d3d9.dll文件损坏丢失找不到 打不开软件问题 免费下载方法
  • 25年总结 | 26年规划
  • Java 大视界 -- Java 大数据在智能医疗远程康复监测与个性化康复方案制定中的应用
  • 震惊!这家酶制剂工厂竟让同行都慌了
  • 千万别错过!这5家酶制剂厂让生产效益翻倍
  • BOM到底是什么?ERP里为什么没有它就不行
  • 2026专科生必看!10个降AI率工具测评榜单
  • 千万注意!这家酶制剂厂商竟如此权威
  • laravel的session_start(); 是在哪里调用的?
  • 你能成为AI数据训练师吗?工作内容与薪酬分析
  • 2026最新延吉炸鸡/韩式炸鸡本土品牌首选傲叔炸鸡——延边大学网红墙推荐,延吉本地特色加盟连锁餐饮店,延吉人气王,正宗延边风味的品质之选 - 全局中转站
  • GO 教程
  • 大数据领域数据目录与人工智能的融合应用
  • 【QuantumTuan:Qt】
  • 智慧工厂数据底座再获权威认可:YMatrix 携手赣锋锂业、孚能科技入选 2025 数据智能“星河”案例
  • Claude Code 13个工程实践:详解Claude Code之父Boris的技巧分享
  • 通过 Rust 库(Rust Python 包)—— 工程化
  • Vue 3 TypeScript 接口Interface使用示例
  • 如何解决recv被业务阻塞导致的 netlink 消息丢失问题?
  • 点分治
  • Flutter 页面为什么会频繁 rebuild?如何定位和优化?
  • 《法网破晓》《两个她》同日开机 法治现实与女性悬疑双线并行