使用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>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论