react-fetch-streams中useStream的使用

文章介绍了如何使用react-fetch-streams库的useStreamHook来处理StreamsAPI,以实现从ChatGPT接口获取数据的流式处理。通过流API,可以逐块接收和处理数据,减少用户等待的焦虑,提高用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

react-fetch-streams中useStream的使用

这是react-fetch-streams的官网:

react-fetch-streams | React hook for the Streams API. (rolandjitsu.github.io)

前言:

最近chatgpt很火爆,但是因为chatgpt的服务器在国外,接口返回得很慢。所以决定使用stream API以编程方式访问从网络接收的数据流,流会将你想要从网络接受的资源分成一个个小的分块,然后按位处理它。这正是浏览器在接收用于显示 web 页面的资源时做的事情——视频缓冲区和更多的内容可以逐渐播放,有时候随着内容的加载,你可以看到图像逐渐地显示。这样从视觉效果上可以缓解在接口等待的过程中用户的焦虑情况。

了解:

  1. react-fetch-streams | React hook for the Streams API. (rolandjitsu.github.io)

​ 这是react的一个专门用于接入Streams API的一个库。

  1. 具体代码(本代码只针对本项目适用,但是大部分的逻辑是可以复用的)
import React, { useCallback, useState, useRef } from 'react';
import { useStream } from 'react-fetch-streams';
import { _getQuerystr } from '@/services/api';

const ChatGptStream = (props) => {
  const { params, onMessageSend } = props;
  const [chatgptAnswerList, setChatgptAnswerList] = useState([]);
  const answerDataRef = useRef('');

  const getChatGptStream = useCallback(async res => {
 // 返回的res通过response属性提供了一个具体的 ReadableStream 对象
 // xxxx.getReader().read()拿到utf-8格式的返回值
    let data = await res.body.getReader().read();
 // 对utf-8格式的data进行解码
    data.output = new TextDecoder('utf-8').decode(data.value);
    if (data.output.indexOf('<br/>') > -1) {
      return
    }
    answerDataRef.current += data.output;
    setChatgptAnswerList([answerDataRef.current])
  }, []);

  useStream(`https://chatgpt.siuvo.com/chat_stream_html_demo${_getQuerystr(params)}`, { onNext: getChatGptStream });

  return (
    <div className='chatgpt-amswer-block'>
      {
        chatgptAnswerList && chatgptAnswerList.map((item, index) => {
          return (
            <div className='chatgpt-answer-item' key={index}>
              <div className='item-adopt'
                onClick={() => onMessageSend(item)}
              >
                采用
              </div>
              <div
                className='item-message'>
                {item}
              </div>
            </div>
          )
        })
      }
    </div>
  )
}

export default ChatGptStream;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值