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

news2024/11/17 7:56:56

在这里插入图片描述

工具

// 接受参数
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.guideList
        scrollViewBottom()
      })
      return
    }
    chunk = JSON.parse(chunk)
    if (chunk.type === 'error') {
      errorText = chunk.content
      console.log("errorText", errorText);
      updateChatData(errorText)
      return;
    }
    chunk = chunk.content;
    if (!chunk) {
      return;
    }
    lastText = lastText + chunk
    // 更新聊天数据源中的对话
    updateChatData(lastText)
  },
  finallyHandler: () => {
    console.log("finallyHandler操作")
    sessionStatus.value = 0
    inputDisabled.value = false
    dataSources.value[dataSources.value.length - 1].loading = false
    loading.value = false
    if (!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.coloradmin.cn/o/1284332.html

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

相关文章

用户态和内核态

实际上任何Linux发行版(Centos/RedHat....),其系统内核都是Linux。我们的应用都需要通过Linux内核与硬件交互。为了避免用户应用导致冲突甚至内核崩溃,用户应用与内核是分离的: 进程的寻址空间会划分为两部分:内核空间、用户空间。…

虾皮数据分析网站:了解Shopee市场趋势与优化运营的利器

在如今的电商时代,越来越多的人选择在虾皮购物(Shopee)平台上开设自己的店铺。然而,要在这个竞争激烈的市场中脱颖而出并取得成功,并不是一件容易的事情。为了更好地了解市场趋势、优化产品和店铺运营,了解…

百度地图取点 范围绘制 画范围 手工绘制范围

<template><div class"app-container"><div style"margin-bottom:30px"><el-input type"textarea" :rows"2" placeholder"请输入内容" v-model"str"></el-input></div><d…

基于SSM框架的网上书店系统

基于SSM框架的网上书店系统 文章目录 基于SSM框架的网上书店系统 一.引言二.系统设计三.技术架构四.功能实现五.界面展示六.源码获取 一.引言 随着互联网的普及和电子商务的快速发展&#xff0c;网上书店系统成为了现代人购买图书的主要方式之一。网上书店系统不仅提供了便捷的…

MFC发送ZPL指令控制斑马打印机

1、参考1&#xff1a;用Python操控斑马打印机的技术总结 - 重拾初心的青年人 - 博客园 (cnblogs.com) 参考2&#xff1a;VC斑马打印机_vc zpl-CSDN博客 参考3&#xff1a;斑马打印机ZPL语言编程实战_梅长酥的博客-CSDN博客 参考4&#xff1a;关于斑马打印机开发的几种方式_斑马…

AGI智能新时代,大模型为软件开发带来范式变革

导语 | 人工智能作为新一轮科技革命和产业变革的重要驱动力量&#xff0c;尤其是在当下新一轮 AI 大模型、生成式 AI 浪潮背景下&#xff0c;重视通用人工智能&#xff08;AGI&#xff09;成为行业的共识。在当前&#xff0c; AGI 技术背后的逻辑究竟是怎样的&#xff1f;技术创…

【shell】

shell 一、shell简介二、shell脚本的执行方式三、shell变量3.1 shell变量介绍3.2 shell变量的定义3.1.1 基本语法3.2.2 定义变量的规则3.2.3 将命令的返回值赋予变量 四、环境变量的设置4.1 基本语法&#xff1a; 五、位置参数变量5.1 基本介绍5.2 基本语法 六、预定义变量6.1 …

人工智能_机器学习059_非线性核函数_poly核函数_rbf核函数_以及linear核函数效果对比---人工智能工作笔记0099

人工智能_机器学习059_非线性核函数介绍---人工智能工作笔记0099 那么我们应该如何调整这个SVC的参数,也就是我们应该使用哪种核函数,比较合适呢?这取决于我们的数据,适合使用哪个核函数,正好我们有 提供的score = accuracy_score(y_test,y_pred) 这样的评分函数,我们可以根据…

安装Python以及pycharm

Pycharm是编辑器。相当于Word对文字进行编辑。 Python是解释器。讲代码翻译为计算机可以理解的指令。 1、安装Python 官网&#xff1a;Welcome to Python.org 打开的时候有点慢等待一会就好&#xff0c;点击下载&#xff0c;选择Windows版本 等待一会&#xff0c;可以看到如…

全志T527设置gpio口输出高电平实际输出低电平

前言 在调试T527的时候&#xff0c;主板另外添加了gpio口去控制usb口的电源开关&#xff0c;软件上面需要在内核运行的时候将gpio口设置输出高电平&#xff0c;usb口才可以正常使用。改好系统固件后&#xff0c;升级发现&#xff0c;机器开机动画过程中可以控制gpio口去打开us…

怎么翻译英文医学文献资料

文献翻译是一项要求严谨、精确且地道的工作&#xff0c;对于医学文献翻译更是如此。那么&#xff0c;怎么翻译英文医学文献资料&#xff0c;医学英文文献翻译公司哪个好&#xff1f; 专业人士指出&#xff0c;在翻译医学文献时&#xff0c;理解原文的语境是至关重要的。这不仅需…

沐风老师3DMAX随机变换工具RandomTransform插件使用方法详解

3DMAX随机变换工具RandomTransform插件使用方法 3dMax随机变换工具RandomTransform&#xff0c;是一款用MAXScript脚本语言开发的3dsMax小工具&#xff0c;可以随机变换选中的单个或多个对象的位置、角度及大小。 在3dMax中“变换”工具是最常用的工具&#xff08;移动、旋转和…

配置multipath.conf后linux主机重启异常处理

有个db备库主机&#xff0c;操作系统是Oracle Linux Server release 8.8&#xff0c;因本地空间不足&#xff0c;通过fc挂接存储磁盘&#xff0c;配置/etc/multipath.conf后&#xff0c;重启主机验证&#xff0c;发现启动异常&#xff0c;入下图 # lsb_release -a LSB Version…

Python入门07循环及常见的数据结构

目录 1 循环的语法结构2 break和continue的示例3 可迭代对象4 列表5 元组6 列表和元组的应用场景7 集合8 字典9 生成器 1 循环的语法结构 在Python中&#xff0c;循环是一种控制结构&#xff0c;用于重复执行一段代码&#xff0c;直到满足特定条件。Python中有两种循环结构&am…

Ribbon-IRule 修改负载均衡的规则

1、负载均衡规则描述 &#xff08;1&#xff09;整体关系 &#xff08;2&#xff09;规则描述 内置负载均衡规则类规则描述RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下&…

阿里蹲完滴滴蹲,滴滴蹲完腾讯蹲,昨晚腾讯视频出现短暂技术故障

01 腾讯视频出现短暂技术问题。昨晚&#xff08;12月3日&#xff0c;周日&#xff09;&#xff0c;不少网友休息天都在观看影视节目&#xff0c;然而有网友突然发现腾讯视频出现网络故障。据网友反馈&#xff0c;具体问题&#xff1a;如首页无法加载内容、VIP用户看不了会员视频…

电力系统中的直流负载,你了解多少?

直流负载在电力系统中扮演着重要的角色&#xff0c;它是电力系统的重要组成部分&#xff0c;对于电力系统的稳定运行起着至关重要的作用。直流负载主要包括直流电动机、蓄电池、电解设备等。 首先&#xff0c;我们来了解一下直流负载的基本原理。直流负载是指能够将电能转化为其…

【STM32】TIM定时器输出比较

1 输出比较 1.1 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较&#xff1b;IC&#xff08;Input Capture&#xff09;输入捕获&#xff1b;CC&#xff08;Capture/Compare&#xff09;输入捕获和输出比较的单元输出比较可以通过比较CNT与CCR寄存器值&#…

Windows系统远程桌面本地Ubuntu虚拟机

应用概览 在Windows系统上&#xff0c;有时候我们虽然本地安装了Linux虚拟机系统&#xff0c;但是由于特殊原因导致虚拟机与主体机之间无法复制粘贴文本和文件&#xff0c;但是却有基本的联网功能&#xff0c;此时就可以用本方案解决&#xff0c;即&#xff1a;本地远程桌面方…

好大夫数据爬取

好大夫数据爬取 问诊数据评论数据医生数据科普号数据医患交流数据 可按照疾病进行所有医生的数据&#xff0c;也可以抓所有问诊数据、评论数据 突破限制&#xff0c;快速交付