Commit 410bdbde by weiyudumei

refactor: 统一使用流结束设置 endAnswerFlag,移除对服务端字段的依赖

parent 317afc2b
...@@ -286,6 +286,26 @@ export const Chat: React.FC = () => { ...@@ -286,6 +286,26 @@ export const Chat: React.FC = () => {
if (msg.content?.name === 'AbortError') { if (msg.content?.name === 'AbortError') {
return return
} }
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
return return
} }
...@@ -304,6 +324,26 @@ export const Chat: React.FC = () => { ...@@ -304,6 +324,26 @@ export const Chat: React.FC = () => {
) )
.then(() => { .then(() => {
// 流结束时执行(通过 Promise resolve 判断) // 流结束时执行(通过 Promise resolve 判断)
// 设置最后一条 AI 回答的 endAnswerFlag,用于控制打字效果结束
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false)) dispatch(setIsAsking(false))
if (isNew) { if (isNew) {
setTimeout(() => { setTimeout(() => {
...@@ -314,6 +354,26 @@ export const Chat: React.FC = () => { ...@@ -314,6 +354,26 @@ export const Chat: React.FC = () => {
.catch((error) => { .catch((error) => {
// 流式请求出错时的处理 // 流式请求出错时的处理
console.error('[Chat] 流式请求失败:', error) console.error('[Chat] 流式请求失败:', error)
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false)) dispatch(setIsAsking(false))
}) })
} }
......
...@@ -511,6 +511,26 @@ export const TacticsChat: React.FC = () => { ...@@ -511,6 +511,26 @@ export const TacticsChat: React.FC = () => {
if (msg.content?.name === 'AbortError') { if (msg.content?.name === 'AbortError') {
return return
} }
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
// 其他错误也可以在这里显示错误消息 // 其他错误也可以在这里显示错误消息
return return
} }
...@@ -531,6 +551,26 @@ export const TacticsChat: React.FC = () => { ...@@ -531,6 +551,26 @@ export const TacticsChat: React.FC = () => {
.then(() => { .then(() => {
// 流结束时执行(通过 Promise resolve 判断,而不是 END 消息) // 流结束时执行(通过 Promise resolve 判断,而不是 END 消息)
console.log('[TacticsChat] 流式响应已完成') console.log('[TacticsChat] 流式响应已完成')
// 设置最后一条 AI 回答的 endAnswerFlag,用于控制打字效果结束
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false)) dispatch(setIsAsking(false))
if (isNew) { if (isNew) {
setTimeout(() => { setTimeout(() => {
...@@ -541,6 +581,26 @@ export const TacticsChat: React.FC = () => { ...@@ -541,6 +581,26 @@ export const TacticsChat: React.FC = () => {
.catch((error) => { .catch((error) => {
// 流式请求出错时的处理 // 流式请求出错时的处理
console.error('[TacticsChat] 流式请求失败:', error) console.error('[TacticsChat] 流式请求失败:', error)
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => {
const newItems = [...prevItems]
// 从后往前找到最后一个 AI 项
for (let i = newItems.length - 1; i >= 0; i--) {
if (newItems[i].role === 'ai' && newItems[i].answerList?.[0]) {
newItems[i] = {
...newItems[i],
answerList: [
{
...newItems[i].answerList[0],
endAnswerFlag: true,
},
],
}
break
}
}
return newItems
})
dispatch(setIsAsking(false)) dispatch(setIsAsking(false))
}) })
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment