如何使用fetchEventSource实现sse流式请求

 更新时间:2024年08月30日 08:40:58   作者:写代码的拉克丝  
这篇文章主要介绍了如何使用fetchEventSource实现sse流式请求问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

使用fetchEventSource实现sse流式请求

最近在项目开发的过程中,需要实现一个功能

根据进度条的进度动态实时加载获取到的数据并展示出来

用到的是fetchEventSource

以下主要写下js的实现的过程(前端用到的ui组件是antd-design-vue1.78版本 vue2.0项目)

首先下载插件:

npm install --save @microsoft/fetch-event-source

<div class="progress_container" v-if="!progressDone">
        <div class="progress_row">
          <a-progress type="line" :percent="progressValue" status="active" />
        </div>
        <div class="progress_text">
          {{ progressTxt }}
        </div>
</div>


<script>
  import { fetchEventSource } from '@microsoft/fetch-event-source'
  import storage from 'store'
  import { ACCESS_TOKEN } from '@/store/mutation-types'
   export default {
        data () {
          return {
            speed: 30,
            progressValue: 0,//进度条初始值
            progressTxt: '',//进度条文字展示默认值
            eventSource: null,
            abortController: null,
            checkMessage: [],
            checkResult: {},
            resultData: [],
            submitUnable: true,
            progressDone: false
          }
        },
      created () {
        this.connectSSE()
      },
      destroyed () {
          this.stopSSE()
      },
      methods: {
        connectSSE () {
          this.abortController = new AbortController() // 终止or结束会话,做了个全局的...
          const url = process.env.VUE_APP_API_BASE_URL + `自己的请求数据接口`
          const token = storage.get(ACCESS_TOKEN)
          // 开始会话链接,也做了个全局的......
          this.eventSource = fetchEventSource(url, {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
              [ACCESS_TOKEN]: token
            },
            // 传参只能发送文本格式的数据
            body: JSON.stringify({
           
            }),
            signal: this.abortController.signal,
            onopen: (event) => {
              console.log(event, 'SSE在连接打开时被调用')
            },
            onmessage: (event) => {
              // console.log('SSE会在通过事件源收到数据时触发')
              // console.log('接口返回', JSON.parse(event.data))
              //我这里是判断我请求回来的数据里是否包含'[DONE]',他是数组里的最后一项,表示加载完成
              if (!event.data.includes('[DONE]')) {
                const data = JSON.parse(event.data)
                const text = data.message
                const percent = data.percent
                const message = data.message
                if (text === 'connect') {
                  // 连接成功,开始检测逻辑
                  this.progressDone = false
                  this.progressValue = 0
                  this.progressTxt = '数据检查中,该过程可能需要一段时间,请勿关闭窗口'
                
                  this.getTurnCheck()
                 return false
                }
                //定时器,控制进度条和文字的展示速度
                this.speed += 300
                this.timer = setTimeout(() => {
                  this.progressValue = Number(percent)
                  this.progressTxt = message
                  if (this.progressValue === 100 && !this.progressDone) {
                 
                    this.stopSSE()
                  }
                }, this.speed)
              }
              
              if (event.data.includes('[DONE]')) {
              }
              
            },
            onerror: () => {
              console.log('SSE抛出异常onerror')
              this.stopSSE()
            },
            // onclose函数是会话结束正常关闭触发,但几乎没有做到这步,不执行这个回调,不知道什么原因
            onclose: () => {
              console.log('onclose') 
            }
          })
        },
        // 停止SSE
        async stopSSE () {
          // 关闭业务,执行关闭sse数据接口
          await this.getCloseSse()
          if (this.abortController) {
            this.timer && clearTimeout(this.timer)
            console.log('SSE结束会话了')
            this.abortController.abort() // 结束会话
          }
        },
        //检查数据的接口
        async getTurnCheck () {
          const params = {
            
          }
      
        },
        //关闭sse接口
        async getCloseSse () {
          const params = {
            
          }
          const [err, res] = await to(closeSse(params))
          if (err) return false
        }

      },


    }
</script>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue-admin-template 动态路由的实现示例

    vue-admin-template 动态路由的实现示例

    本文主要介绍了ue-admin-template动态路由的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • vue更新数据却不渲染页面的解决

    vue更新数据却不渲染页面的解决

    这篇文章主要介绍了vue更新数据却不渲染页面的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • SpringBoot+Vue3实现文件的上传和下载功能

    SpringBoot+Vue3实现文件的上传和下载功能

    上传文件和下载文件是我们平时经常用到的功能,接下来就让我们用SpringBoot,Vue3和ElementPlus组件实现文件的上传和下载功能吧,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Vue3如何使用axios发起网络请求

    Vue3如何使用axios发起网络请求

    这篇文章主要介绍了Vue3如何使用axios发起网络请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue2.0实现的tab标签切换效果(内容可自定义)示例

    vue2.0实现的tab标签切换效果(内容可自定义)示例

    这篇文章主要介绍了vue2.0实现的tab标签切换效果,结合实例形式分析了vue.js实现内容可自定义的tab点击切换功能相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • Vue3计算属性computed和监听属性watch区别解析

    Vue3计算属性computed和监听属性watch区别解析

    计算属性适用于对已有的数据进行计算,派生新的数据,并在模板中使用;而监听属性适用于监听数据的变化,并执行一些特定的操作,根据具体的需求和场景,选择适合的机制这篇文章主要介绍了Vue3计算属性computed和监听属性watch,需要的朋友可以参考下
    2024-02-02
  • vue如何使用formData传递文件类型的数据

    vue如何使用formData传递文件类型的数据

    这篇文章主要介绍了vue如何使用formData传递文件类型的数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue使用jsmind实现生成脑图的示例代码

    Vue使用jsmind实现生成脑图的示例代码

    这篇文章主要为大家详细介绍了Vue如何使用jsmind实现生成脑图,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-03-03
  • vue中watch的实际开发学习笔记

    vue中watch的实际开发学习笔记

    watch是Vue实例的一个属性是用来响应数据的变化,需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的,下面这篇文章主要给大家介绍了关于vue中watch的实际开发笔记,需要的朋友可以参考下
    2022-11-11
  • vue如何通过ref调用router-view子组件的方法

    vue如何通过ref调用router-view子组件的方法

    这篇文章主要介绍了vue 通过ref调用router-view子组件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11

最新评论