fix: 修复 chat 视图无法滚动 + SSE 事件重复消费
- scrollResultToLatest 守卫条件兼容 chat 视图 - shortNovel.js 添加 chunkProcessed 标志位避免 H5 双重消费
This commit is contained in:
@@ -866,7 +866,7 @@ const keepGenerationAtBottom = () => {
|
||||
}
|
||||
|
||||
const scrollResultToLatest = () => {
|
||||
if (viewState.value !== 'result') return
|
||||
if (viewState.value !== 'result' && viewState.value !== 'chat') return
|
||||
nextTick(() => {
|
||||
measureResultViewport()
|
||||
pushResultScrollCommand(1000000)
|
||||
|
||||
@@ -14,6 +14,7 @@ import { getApiBaseUrl, getAuthHeader } from './request.js'
|
||||
* @returns {Object} uni.request 任务对象(用于 abort)
|
||||
*/
|
||||
export const startNovelStream = ({ query, onEvent, onError }) => {
|
||||
let chunkProcessed = false
|
||||
const task = uni.request({
|
||||
url: `${getApiBaseUrl()}/shortNovel/stream`,
|
||||
method: 'POST',
|
||||
@@ -30,7 +31,8 @@ export const startNovelStream = ({ query, onEvent, onError }) => {
|
||||
onError?.(res.data?.message || '请求失败')
|
||||
return
|
||||
}
|
||||
if (typeof res.data === 'string' && res.data) {
|
||||
// 仅在 chunk 未处理时才处理完整 data(避免 H5 双重消费)
|
||||
if (!chunkProcessed && typeof res.data === 'string' && res.data) {
|
||||
consumeSseText(res.data, onEvent, onError)
|
||||
}
|
||||
},
|
||||
@@ -40,6 +42,7 @@ export const startNovelStream = ({ query, onEvent, onError }) => {
|
||||
})
|
||||
|
||||
task?.onChunkReceived?.((res) => {
|
||||
chunkProcessed = true
|
||||
try {
|
||||
const text = decodeChunk(res.data)
|
||||
consumeSseText(text, onEvent, onError)
|
||||
@@ -62,6 +65,7 @@ export const startNovelStream = ({ query, onEvent, onError }) => {
|
||||
* @returns {Object} uni.request 任务对象
|
||||
*/
|
||||
export const followupStream = ({ sessionId, action, payload, onEvent, onError }) => {
|
||||
let chunkProcessed = false
|
||||
const task = uni.request({
|
||||
url: `${getApiBaseUrl()}/shortNovel/followup`,
|
||||
method: 'POST',
|
||||
@@ -78,7 +82,7 @@ export const followupStream = ({ sessionId, action, payload, onEvent, onError })
|
||||
onError?.(res.data?.message || '请求失败')
|
||||
return
|
||||
}
|
||||
if (typeof res.data === 'string' && res.data) {
|
||||
if (!chunkProcessed && typeof res.data === 'string' && res.data) {
|
||||
consumeSseText(res.data, onEvent, onError)
|
||||
}
|
||||
},
|
||||
@@ -88,6 +92,7 @@ export const followupStream = ({ sessionId, action, payload, onEvent, onError })
|
||||
})
|
||||
|
||||
task?.onChunkReceived?.((res) => {
|
||||
chunkProcessed = true
|
||||
try {
|
||||
const text = decodeChunk(res.data)
|
||||
consumeSseText(text, onEvent, onError)
|
||||
|
||||
Reference in New Issue
Block a user