如何解决前端JavaScript处理流式响应的坑

 更新时间:2025年06月27日 11:27:01   作者:小周同学:  
axios是一个支持node端和浏览器端的易用、简洁且高效的http库,这篇文章主要介绍了如何解决前端JavaScript处理流式响应的坑,文中通过代码介绍的非常详细,需要的朋友可以参考下

给使用 JavaScript 的同学提个醒!

浏览器端处理流式响应,想要完美体验 请使用 Fetch API。

Axios 无法使用stream来直接处理真正的流式响应(但 Node.js 中可以使用 stream),这与浏览器底层 HTTP 请求实现的限制有关。

为什么浏览器中的 Axios 不能直接处理流?

1. 底层机制差异

  • Node.js 环境:Axios 使用 Node.js 的 http 模块,天然支持流式传输(responseType:
    ‘stream’),数据可以逐块(chunk)接收。
  • 浏览器环境:浏览器端 Axios 基于 XMLHttpRequest,而 XMLHttpRequest 的 responseType
    属性不允许设为 stream,合法值仅有: arraybuffer | blob | document | json | text。

即使服务端返回流式响应(如 text/event-stream 或分块数据),浏览器也无法通过 Axios 直接以流的形式逐块解析数据。Axios 在浏览器中只能一次性接收完整响应,再通过字符串或文本处理模拟“流式效果”。

2. 如果必须使用 Axios

  • 可以通过更改 responseType: ‘text’ 和 手动分块处理 模拟流式效果,但存在以下问题:
    数据完整性风险:依赖服务端分块的准确性,需维护缓冲区(buffer)处理不完整数据。 性能损失:需手动分割字符串,效率低于原生流式处理。
  <script>
    // fetch 请求,stream 流式响应
    async function fetchStreaming () {
      const response = await fetch('http://192.168.21.24:11434/api/chat', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        // 请求传递给 ollama 数据
        body: JSON.stringify({
          model: 'deepseek-r1:32b',
          messages: [
            { "role": "user", "content": "北京天安门看升旗仪式怎么预约?" }
          ]
        })
      })

      if (!response.body) {
        throw new Error('Response body is null')
      }
      // 读取数据流
      const reader = response.body.getReader()
      // 文本解码器
      const decoder = new TextDecoder()
      let buffer = ''

      while (true) {
        const { done, value } = await reader.read()
        if (done) break

        buffer += decoder.decode(value, { stream: true })
        const lines = buffer.split('\n')
        buffer = lines.pop() || ''

        for (const line of lines) {
          if (line.trim()) {
            try {
              const data = JSON.parse(line)
              // 实时输出
              console.log(data.message.content)
            } catch (err) {
              console.error('解析错误:', err)
            }
          }
        }
      }
    }

    fetchStreaming()



  </script>

实现效果

(处理成这样之后需要前端来优化下界面样式区分思考过程和答案)

总结 

到此这篇关于如何解决前端JavaScript处理流式响应坑的文章就介绍到这了,更多相关JS处理流式响应坑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Javascript HTML5 Canvas实现的一个画板

    Javascript HTML5 Canvas实现的一个画板

    这篇文章主要为大家详细介绍了Javascript HTML5 Canvas实现的一个画板的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • js实现图片无缝滚动

    js实现图片无缝滚动

    这篇文章主要介绍了Javascript图片无缝滚动的相关内容,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 基于JS实现操作成功之后自动跳转页面

    基于JS实现操作成功之后自动跳转页面

    这篇文章主要介绍了基于JS实现操作成功之后自动跳转页面的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • arctext.js实现文字平滑弯曲弧形效果的插件

    arctext.js实现文字平滑弯曲弧形效果的插件

    这篇文章主要介绍了arctext.js实现文字平滑弯曲弧形效果的插件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • JS获取本机IP地址的2种方法

    JS获取本机IP地址的2种方法

    我们在项目经常遇到获取本机IP地址的需求,下面这篇文章主要给大家介绍了关于JS获取本机IP地址的2种方法,文中通过示例代码介绍的非常详细,本文适合新手,需要的朋友可以参考下
    2022-09-09
  • 细说webpack源码之compile流程-rules参数处理技巧(1)

    细说webpack源码之compile流程-rules参数处理技巧(1)

    webpack作为一种流行的打包工具被广泛应用在web项目的前端工程化构建中。下面通过本文给大家介绍webpack源码之compile流程-rules参数处理技巧,感兴趣的朋友一起看看吧
    2017-12-12
  • IE6下JS动态设置图片src地址问题

    IE6下JS动态设置图片src地址问题

    解决IE6下JS动态设置图片IMG的SRC时图片无法加载错误的方法
    2010-01-01
  • javascript实现带节日和农历的日历特效

    javascript实现带节日和农历的日历特效

    这篇文章主要介绍了javascript实现带节日和农历的日历特效,效果十分棒,需要的朋友可以参考下
    2015-02-02
  • js canvas仿支付宝芝麻信用分仪表盘

    js canvas仿支付宝芝麻信用分仪表盘

    这篇文章主要为大家详细介绍了js canvas仿支付宝芝麻信用分仪表盘,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 详解小程序原生使用ES7 async/await语法

    详解小程序原生使用ES7 async/await语法

    这篇文章主要介绍了详解小程序原生使用ES7 async/await语法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论