如何解決前端JavaScript處理流式響應(yīng)的坑
給使用 JavaScript 的同學(xué)提個(gè)醒!
瀏覽器端處理流式響應(yīng),想要完美體驗(yàn) 請(qǐng)使用 Fetch API。
Axios 無法使用stream來直接處理真正的流式響應(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ù)),瀏覽器也無法通過 Axios 直接以流的形式逐塊解析數(shù)據(jù)。Axios 在瀏覽器中只能一次性接收完整響應(yīng),再通過字符串或文本處理模擬“流式效果”。
2. 如果必須使用 Axios
- 可以通過更改 responseType: ‘text’ 和 手動(dòng)分塊處理 模擬流式效果,但存在以下問題:
數(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)效果
(處理成這樣之后需要前端來優(yōu)化下界面樣式區(qū)分思考過程和答案)

總結(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í)功能
本文主要介紹了通過js實(shí)現(xiàn)頁面的倒計(jì)時(shí)功能的思路與方法,具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01
使用JavaScript下載圖片并保存到本地的詳細(xì)解釋和代碼示例
在前端開發(fā)中經(jīng)常會(huì)遇到需要將圖片從網(wǎng)絡(luò)上下載并保存到本地的需求,這篇文章主要給大家介紹了關(guān)于使用JavaScript下載圖片并保存到本地的詳細(xì)解釋和代碼示例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
小程序數(shù)據(jù)緩存機(jī)制應(yīng)用實(shí)現(xiàn)
這篇文章主要介紹了小程序數(shù)據(jù)緩存機(jī)制應(yīng)用實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
js獲取元素的偏移量offset簡(jiǎn)單方法(必看)
下面小編就為大家?guī)硪黄猨s獲取元素的偏移量offset簡(jiǎn)單方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
解決npm安裝Electron緩慢網(wǎng)絡(luò)超時(shí)導(dǎo)致失敗的問題
下面小編就為大家分享一篇解決npm安裝Electron緩慢網(wǎng)絡(luò)超時(shí)導(dǎo)致失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
KnockoutJS數(shù)組比較算法實(shí)例詳解
這篇文章主要介紹了KnockoutJS數(shù)組比較算法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
javascript多物體運(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-01
FireFox下XML對(duì)象轉(zhuǎn)化成字符串的解決方法
近,在客戶端解吸xml時(shí)候,需要將XML轉(zhuǎn)化成字符串,看了很多文章,介紹的最多的是將XML字符串轉(zhuǎn)化成對(duì)象2011-12-12

