如何解決前端JavaScript處理流式響應(yīng)的坑
給使用 JavaScript 的同學(xué)提個(gè)醒!
瀏覽器端處理流式響應(yīng),想要完美體驗(yàn) 請(qǐng)使用 Fetch API。
Axios 無(wú)法使用stream來(lái)直接處理真正的流式響應(yīng)(但 Node.js 中可以使用 stream),這與瀏覽器底層 HTTP 請(qǐng)求實(shí)現(xiàn)的限制有關(guān)。
為什么瀏覽器中的 Axios 不能直接處理流?
1. 底層機(jī)制差異
- Node.js 環(huán)境:Axios 使用 Node.js 的 http 模塊,天然支持流式傳輸(responseType:
‘stream’),數(shù)據(jù)可以逐塊(chunk)接收。 - 瀏覽器環(huán)境:瀏覽器端 Axios 基于 XMLHttpRequest,而 XMLHttpRequest 的 responseType
屬性不允許設(shè)為 stream,合法值僅有: arraybuffer | blob | document | json | text。
即使服務(wù)端返回流式響應(yīng)(如 text/event-stream 或分塊數(shù)據(jù)),瀏覽器也無(wú)法通過(guò) Axios 直接以流的形式逐塊解析數(shù)據(jù)。Axios 在瀏覽器中只能一次性接收完整響應(yīng),再通過(guò)字符串或文本處理模擬“流式效果”。
2. 如果必須使用 Axios
- 可以通過(guò)更改 responseType: ‘text’ 和 手動(dòng)分塊處理 模擬流式效果,但存在以下問(wèn)題:
數(shù)據(jù)完整性風(fēng)險(xiǎn):依賴服務(wù)端分塊的準(zhǔn)確性,需維護(hù)緩沖區(qū)(buffer)處理不完整數(shù)據(jù)。 性能損失:需手動(dòng)分割字符串,效率低于原生流式處理。
<script> // fetch 請(qǐng)求,stream 流式響應(yīng) async function fetchStreaming () { const response = await fetch('http://192.168.21.24:11434/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, // 請(qǐng)求傳遞給 ollama 數(shù)據(jù) body: JSON.stringify({ model: 'deepseek-r1:32b', messages: [ { "role": "user", "content": "北京天安門看升旗儀式怎么預(yù)約?" } ] }) }) if (!response.body) { throw new Error('Response body is null') } // 讀取數(shù)據(jù)流 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) // 實(shí)時(shí)輸出 console.log(data.message.content) } catch (err) { console.error('解析錯(cuò)誤:', err) } } } } } fetchStreaming() </script>
實(shí)現(xiàn)效果
(處理成這樣之后需要前端來(lái)優(yōu)化下界面樣式區(qū)分思考過(guò)程和答案)
總結(jié)
到此這篇關(guān)于如何解決前端JavaScript處理流式響應(yīng)坑的文章就介紹到這了,更多相關(guān)JS處理流式響應(yīng)坑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
純js實(shí)現(xiàn)倒計(jì)時(shí)功能
本文主要介紹了通過(guò)js實(shí)現(xiàn)頁(yè)面的倒計(jì)時(shí)功能的思路與方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01使用JavaScript下載圖片并保存到本地的詳細(xì)解釋和代碼示例
在前端開(kāi)發(fā)中經(jīng)常會(huì)遇到需要將圖片從網(wǎng)絡(luò)上下載并保存到本地的需求,這篇文章主要給大家介紹了關(guān)于使用JavaScript下載圖片并保存到本地的詳細(xì)解釋和代碼示例,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07小程序數(shù)據(jù)緩存機(jī)制應(yīng)用實(shí)現(xiàn)
這篇文章主要介紹了小程序數(shù)據(jù)緩存機(jī)制應(yīng)用實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05js獲取元素的偏移量offset簡(jiǎn)單方法(必看)
下面小編就為大家?guī)?lái)一篇js獲取元素的偏移量offset簡(jiǎn)單方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07解決npm安裝Electron緩慢網(wǎng)絡(luò)超時(shí)導(dǎo)致失敗的問(wèn)題
下面小編就為大家分享一篇解決npm安裝Electron緩慢網(wǎng)絡(luò)超時(shí)導(dǎo)致失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02一個(gè)javascript參數(shù)的小問(wèn)題
2008-03-03KnockoutJS數(shù)組比較算法實(shí)例詳解
這篇文章主要介紹了KnockoutJS數(shù)組比較算法實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11javascript多物體運(yùn)動(dòng)實(shí)現(xiàn)方法分析
這篇文章主要介紹了javascript多物體運(yùn)動(dòng)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了JavaScript多物體運(yùn)動(dòng)的相關(guān)注意事項(xiàng)與具體實(shí)現(xiàn)代碼,包含四個(gè)div塊的橫向、豎向移動(dòng),顏色與邊框漸變效果,需要的朋友可以參考下2016-01-01FireFox下XML對(duì)象轉(zhuǎn)化成字符串的解決方法
近,在客戶端解吸xml時(shí)候,需要將XML轉(zhuǎn)化成字符串,看了很多文章,介紹的最多的是將XML字符串轉(zhuǎn)化成對(duì)象2011-12-12