前端怎么用 EventSource并配置请求头及加参数(流式数据)

本文主要是介绍前端怎么用 EventSource并配置请求头及加参数(流式数据),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写目录标题

  • 一、EventSourcePolyfill
  • 二、直接上代码

EventSource 接口是 web 内容与服务器发送事件通信的接口。
一个 EventSource 实例会对 HTTP 服务器开启一个持久化的连接,以 text/event-stream 格式发送事件,此连接会一直保持开启直到通过调用 EventSource.close() 关闭。
EventSource 服务器发送事件是单向的。数据消息只能从服务端发送到客户端。

一、EventSourcePolyfill

EventSourcePolyfill 是EventSource封装的一个方法,EventSourcePolyfill 可以配置请求头

// 安装npm install event-source-polyfill --save//引用
import { EventSourcePolyfill } from "event-source-polyfill";

二、直接上代码

 sendRequest(messageId, content, questionId, questionType) {const innerIndex = this.messageList.length - 1;const aiToken = JSON.parse(localStorage.getItem('token'));let that = this;let eventSource;if (questionId) {eventSource = new EventSourcePolyfill(`${process.env.VUE_APP_WEB_API}/url...........?f_rnd=${new Date().getTime()}&message_id=${messageId}&question_id=${questionId}&stream=true`,{headers: {'Content-Type': 'text/event-stream',aiToken: aiToken,accept: '*/*','Cache-Control': 'no-cache',Connection: 'keep-alive',// 'cache-control': 'max-age=0',},});} else {eventSource = new EventSourcePolyfill(`${process.env.VUE_APP_WEB_API}/ai_assistant_chatdoc/receive_message?f_rnd=${new Date().getTime()}&message_id=${messageId}&stream=true`,{headers: {'Content-Type': 'text/event-stream',aiToken: aiToken,accept: '*/*','Cache-Control': 'no-cache',Connection: 'keep-alive',},});}//open:订阅成功(和后端连接成功)eventSource.onopen = function (e) {console.log(e, '连接刚打开时触发');};//message:后端返回信息,格式可以和后端协商that.messageQueue = []; //整个流式数据this.processing = false; //判断是否返回数据中let resultWord = '';let rowData = {};eventSource.onmessage = function (e) {const data = JSON.parse(e.data) || {}; //这里后端返回的是字符串所以目前我这边有转换console.log(data, data.data.content, Date.now());if (data.code === 200) {that.loading = false;that.scrollFlag = false;if (data.data.content === '[DONE]') { //流式结束了rowData = data.data;}that.messageQueue.push(data.data.content);if (that.processing) return;that.processing = true; (async function processMessages() {while (that.processing) {// 改为无限循环let message;if (that.messageQueue.length > 0) {message = that.messageQueue.shift();if (message === '[DONE]') {that.receiveMsg.source = rowData.source;that.receiveMsg.sourceEdit = rowData.is_edit;that.$set(that.messageList[innerIndex], 'message_id', rowData.message_id);that.requestRecomme(messageId, innerIndex);} else {resultWord += message;console.log(resultWord, 'resultWord');that.$set(that.messageList, innerIndex, {type: 'right',session_id: data.data.session_id,message_id: data.data.message_id,reply_id: data.data.reply_id,message: resultWord,source: [],sourceEdit: [],question: [],});that.receiveMsg = that.messageList[innerIndex];that.chcekScroll();that.executeScroll(!that.scrollFlag);}await new Promise(resolve => setTimeout(resolve, 30)); //30毫秒读取一下message} else {that.processing = false;await new Promise(resolve => setTimeout(resolve, 800)); //如果读取速度大于流式返回速度就等一下}if (that.messageQueue.length === 0 && message === '[DONE]') {break;}}that.processing = false;})();}};//  error:错误(可能是断开,可能是后端返回的信息)eventSource.onerror = function (e) {console.log(e, '连接无法打开时触发');eventSource.close(); // 关闭连接setTimeout(() => {}, 5000);};},

链接: https://blog.csdn.net/weixin_49066399/article/details/138713416

这篇关于前端怎么用 EventSource并配置请求头及加参数(流式数据)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091008

相关文章

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项