当前位置: 首页 > article >正文

前端根据后端返回的文本流逐个展示文本内容

前端根据后端返回的文本流逐个展示文本内容

1、前端调用方法

async function fetchStream(url, data, onSuccess, close, error) {
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
  });

  if (!response.ok) {
    onSuccess(`服务响应失败,请稍后重试`);
    close();
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  let result = '';
  while (true) {
    const { done, value } = await reader.read();
    if (done) {
      break;
    }
    const decodedValue = decoder.decode(value, { stream: true });
    result += decodedValue;
    onSuccess && onSuccess(decodedValue); // 每次接收到数据时,调用onSuccess
  }
  close();
  return result;
}

2、使用

const onSend = () => {
  if (!questionText.value.trim()) {
    message('不能发送空消息', { type: 'warning' });
    return;
  }
  chatList.value.push({
    index: chatIndex.value + 1,
    type: 'user',
    content: questionView.value
  });
  chatList.value.push({
    index: chatIndex.value + 1,
    type: 'assistant',
    content: ''
  });
  const data = {
    question: questionView.value,
    modelId: props.modelId,
    sessionId: sessionId.value
  };
  let streamContent = '';
  const onStreamSuccess = (chunk) => {
    streamContent += chunk;
    chatList.value[chatList.value.length - 1].content = streamContent.replace(/\n+/g, ' ').replace(/ {2,}/g, ' ');
    scrollToBottom();
  };
  fetchStream(
    '/ai/aiAgent/stream',
    data,
    onStreamSuccess,
    () => {
      sendloading.value = false;
    },
    () => {
      chatList.value[chatList.value.length - 1].content = '';
      sendloading.value = false;
    }
  );
};

经过以上两步,即可实现文本流逐个显示在界面上。


http://www.kler.cn/a/387968.html

相关文章:

  • 使用Python实现定期从API获取数据并存储到数据库的完整指南
  • MyBatis CRUD快速入门
  • ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结
  • 常用的Anaconda Prompt命令行指令
  • rockylinux 8安装 gcc11.2
  • SpringSecurity源码中核心类
  • Java基础——类和对象的定义链表的创建,输出
  • 通过 ssh config 快速免密连接服务器
  • 【dvwa靶场:XSS系列】XSS (Reflected)低-中-高级别,通关啦
  • 【开发】Java的内存溢出
  • uni-app打包后报错云服务空间未关联
  • unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
  • [python] 如何debug python脚本中C++后端的core dump
  • 【嵌入式开发——ARM】1ARM架构
  • 牛客周赛 Round 67
  • Android 实现一个系统级的悬浮秒表
  • 基于 STM32 的天气时钟项目中添加天气数据的网络获取功能
  • Edge浏览器打开PDF无法显示电子签章
  • mac 本地docker-mysql主从复制部署
  • Hive-testbench套件使用文档
  • Matlab绘制箭头(annotation 、quiver、​quiver3)
  • Python批量合并多个PDF
  • 【Ubuntu24.04】从双系统到虚拟机再到单系统的故事
  • 产品如何3D建模?如何根据使用场景选购3D扫描仪?
  • 书生大模型第四期闯关任务与笔记
  • 在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析