Java调用SSE流式接口,并流式返回给前端实现打字输出效果

前端调用SSE接口

使用js的EventSource API

const source = new EventSource('/sse);

source.onmessage = function(event) {

  const data = JSON.parse(event.data);

  // 结束标识

  if(data == '__stop__') {

    source.close();

    return;

  }

  document.getElementById('events').innerHTML += '<p>${data.message}</p>';

}

source.onerror = function(error) {

  console.error('Error occurred:', error);

  source.close();

}



使用fetchEventSource 插件

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

import {fetchEventSource} from '@microsoft/fetch-event-source';

send() {

  const params = {

    'prompt': ''

  };

  const vm = this;

  const ctrlAbout = new window.AbortController();

  const {signal} = ctrlAbout;

  fetchEventSource(Url, {

    method: 'POST',

    headers: {

      'Content-Type': 'application/json',

      'Accept': 'text/event-stream',

      'X-Requested-With': 'XMLHttpRequest'

    },

    body: JSON.stringify(params),

    signal: ctrlAbout.signal, // AbortSignal

    openWhenHidden: true, // 去u u喜爱哦visibilityCHange事件

    onmessage(event){

      console.loginfo(event.data);

      //在这里操作流式数据

      const message = JSON.parse(event.data);

      vm.content += message.data;

      // 保证打字输入时滚动条在最下方

      vm.$nextTick(() => {

        const contentEl = vm.$refs.content.$el;

        contentEl.scrollTop = contentEl.scrollHeight - contentEl.clientHeight;

      })


    },

    onclose(e) {

      //关闭流

      //中断流式返回

      ctrlAbout.abort();

    },

    onerror(error){

      // 返回流报错

      console.info(error);

      // 中断流式返回

      ctrlAbout.abort();

      //直接抛出错误,避免反复调用

      throw err;

    }

  })

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容