如何使用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>

总结

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

相关文章

  • Element PageHeader页头的使用方法

    Element PageHeader页头的使用方法

    这篇文章主要介绍了Element PageHeader页头的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • vue如何封装自己的Svg图标组件库(svg-sprite-loader)

    vue如何封装自己的Svg图标组件库(svg-sprite-loader)

    这篇文章主要介绍了vue如何封装自己的Svg图标组件库(svg-sprite-loader),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue3中使用VueParticles实现粒子动态背景效果

    vue3中使用VueParticles实现粒子动态背景效果

    为了提高页面展示效果,特别类似于登录界面内容比较单一的,粒子效果作为背景经常使用到,vue工程中利用vue-particles可以很简单的实现页面的粒子背景效果,本文给大家分享vue粒子动态背景效果实现代码,需要的朋友参考下吧
    2022-05-05
  • 在vue3中安装使用bootstrap过程

    在vue3中安装使用bootstrap过程

    这篇文章主要介绍了在vue3中安装使用bootstrap过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • vue配置代理vue.config.js后不生效的解决(小坑)

    vue配置代理vue.config.js后不生效的解决(小坑)

    这篇文章主要介绍了vue配置代理vue.config.js后不生效的解决(小坑),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • vue3 element-plus二次封装组件系列之伸缩菜单制作

    vue3 element-plus二次封装组件系列之伸缩菜单制作

    这篇文章主要介绍了vue3 element-plus二次封装组件系列之伸缩菜单制作,是基于vue3 vite element-plus搭建的,值的注意的时候,里面的图标组件是经过处理的,结合实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • VUE项目中引入vue-router的详细过程

    VUE项目中引入vue-router的详细过程

    vue-router 也叫 vue 路由,根据不同的路径,来执行不同的组件,这篇文章主要介绍了VUE项目中引入vue-router,需要的朋友可以参考下
    2023-05-05
  • vue实现分割验证码效果

    vue实现分割验证码效果

    这篇文章主要为大家详细介绍了vue实现分割验证码效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vue路由传参及props解耦深入分析

    Vue路由传参及props解耦深入分析

    vue路由传参的使用场景一般都是应用在父路由跳转到子路由时,携带参数跳转,下面这篇文章主要给大家介绍了关于vue路由传参方式的方式总结及获取参数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Vue项目如何打包成移动端APP

    Vue项目如何打包成移动端APP

    这篇文章主要介绍了Vue项目如何打包成移动端APP,本文通过图文示例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12

最新评论