前端使用 fetch 接收流式数据处理

流式数据

流式数据是指以连续的方式产生和传输的数据,这类数据通常在实时或接近实时的情况下进行处理

代码部分

这是我测试用的demo,需要后端配合起来一个服务,进行接口调试,下面我把整个demo打包出来

 async getText() {
      const decoder = new TextDecoder("utf-8")
      try {
        const test = "1"
        const stream = await getAiText(test) // 获取流
        const reader = stream.getReader() // 获取流的读取器

        // 读取流数据的函数
        const read = async () => {
          const { done, value } = await reader.read() // 读取下一个数据块
          if (done) {
            console.log("Stream complete")
            return
          }
          const chunk = decoder.decode(value, { stream: true })
          console.log(chunk)//查看数据输出
          setTimeout(() => {
            this.text += chunk // 更新 text
          }, 200)
          read() // 继续读取下一个数据块
        }

        read() // 开始读取流数据
      } catch (error) {
        console.error("Error fetching AI text:", error)
      }
    },

demo,压缩包整不了,看代码吧

//我这里做了个跨域,vite.config.js
// https://vitejs.dev/config/
export default defineConfig({
    plugins: [vue(),

    ],
    server: {
        host: "0.0.0.0",
        proxy: {
            '/stream3': {
                target: 'xxxxxxxxxxx', // 目标服务器地址
                changeOrigin: true, // 允许跨域
                rewrite: (path) => path.replace(/^\/api/, '') // 去掉请求路径中的/api前缀
            },
        }
    },
})

//封装导出请求方法
export const getAiText = async (text) => {
    const response = await fetch('/stream3', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({ test: text }),
    })
    return response.body // 返回 ReadableStream
}
//组件页面引入
<template>
  <div class='HelloWorld_wrap'>
    <h1 @click="getText()">点击</h1>
    {{text}}
  </div>
</template>
<script >
import { getAiText } from "../http/testAi"
import {
  defineComponent,
  ref,
  onMounted,
  onUpdated,
  toRefs,
  reactive,
} from "vue"
export default defineComponent({
  name: "HelloWorld",
  props: {},
  data() {
    return {
      text: "",
    }
  },
  methods: {
    async getText() {
      const decoder = new TextDecoder("utf-8")
      try {
        const test = "1"
        const stream = await getAiText(test) // 获取流
        const reader = stream.getReader() // 获取流的读取器

        // 读取流数据的函数
        const read = async () => {
          const { done, value } = await reader.read() // 读取下一个数据块
          if (done) {
            console.log("Stream complete")
            return
          }
          const chunk = decoder.decode(value, { stream: true })
          console.log(chunk)//查看数据输出
          setTimeout(() => {
            this.text += chunk // 更新 text
          }, 200)
          read() // 继续读取下一个数据块
        }

        read() // 开始读取流数据
      } catch (error) {
        console.error("Error fetching AI text:", error)
      }
    },
  },
  mounted() { },
});
</script>
<style lang="scss" scoped>
</style>
//最后app.vue引入
<script setup>
import HelloWorld from './components/HelloWorld.vue'
</script>

<template>
  <HelloWorld />
</template>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值