如何解決前端JavaScript處理流式響應(yīng)的坑
給使用 JavaScript 的同學(xué)提個醒!
瀏覽器端處理流式響應(yīng),想要完美體驗 請使用 Fetch API。
Axios 無法使用stream來直接處理真正的流式響應(yīng)(但 Node.js 中可以使用 stream),這與瀏覽器底層 HTTP 請求實現(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ù)),瀏覽器也無法通過 Axios 直接以流的形式逐塊解析數(shù)據(jù)。Axios 在瀏覽器中只能一次性接收完整響應(yīng),再通過字符串或文本處理模擬“流式效果”。
2. 如果必須使用 Axios
- 可以通過更改 responseType: ‘text’ 和 手動分塊處理 模擬流式效果,但存在以下問題:
數(shù)據(jù)完整性風(fēng)險:依賴服務(wù)端分塊的準(zhǔn)確性,需維護(hù)緩沖區(qū)(buffer)處理不完整數(shù)據(jù)。 性能損失:需手動分割字符串,效率低于原生流式處理。
<script>
// fetch 請求,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' },
// 請求傳遞給 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)
// 實時輸出
console.log(data.message.content)
} catch (err) {
console.error('解析錯誤:', err)
}
}
}
}
}
fetchStreaming()
</script>
實現(xiàn)效果
(處理成這樣之后需要前端來優(yōu)化下界面樣式區(qū)分思考過程和答案)

總結(jié)
到此這篇關(guān)于如何解決前端JavaScript處理流式響應(yīng)坑的文章就介紹到這了,更多相關(guān)JS處理流式響應(yīng)坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript HTML5 Canvas實現(xiàn)的一個畫板
這篇文章主要為大家詳細(xì)介紹了Javascript HTML5 Canvas實現(xiàn)的一個畫板的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
基于JS實現(xiàn)操作成功之后自動跳轉(zhuǎn)頁面
這篇文章主要介紹了基于JS實現(xiàn)操作成功之后自動跳轉(zhuǎn)頁面的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
arctext.js實現(xiàn)文字平滑彎曲弧形效果的插件
這篇文章主要介紹了arctext.js實現(xiàn)文字平滑彎曲弧形效果的插件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
細(xì)說webpack源碼之compile流程-rules參數(shù)處理技巧(1)
webpack作為一種流行的打包工具被廣泛應(yīng)用在web項目的前端工程化構(gòu)建中。下面通過本文給大家介紹webpack源碼之compile流程-rules參數(shù)處理技巧,感興趣的朋友一起看看吧2017-12-12
javascript實現(xiàn)帶節(jié)日和農(nóng)歷的日歷特效
這篇文章主要介紹了javascript實現(xiàn)帶節(jié)日和農(nóng)歷的日歷特效,效果十分棒,需要的朋友可以參考下2015-02-02

