Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sdream-ai-fe
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
侯明涛
sdream-ai-fe
Commits
410bdbde
Commit
410bdbde
authored
Jan 21, 2026
by
weiyudumei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: 统一使用流结束设置 endAnswerFlag,移除对服务端字段的依赖
parent
317afc2b
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
120 additions
and
0 deletions
+120
-0
src/pages/Chat/Chat.tsx
+60
-0
src/pages/ChatTactics/TacticsChat.tsx
+60
-0
No files found.
src/pages/Chat/Chat.tsx
View file @
410bdbde
...
...
@@ -286,6 +286,26 @@ export const Chat: React.FC = () => {
if
(
msg
.
content
?.
name
===
'AbortError'
)
{
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
}
...
...
@@ -304,6 +324,26 @@ export const Chat: React.FC = () => {
)
.
then
(()
=>
{
// 流结束时执行(通过 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
))
if
(
isNew
)
{
setTimeout
(()
=>
{
...
...
@@ -314,6 +354,26 @@ export const Chat: React.FC = () => {
.
catch
((
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
))
})
}
...
...
src/pages/ChatTactics/TacticsChat.tsx
View file @
410bdbde
...
...
@@ -511,6 +511,26 @@ export const TacticsChat: React.FC = () => {
if
(
msg
.
content
?.
name
===
'AbortError'
)
{
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
}
...
...
@@ -531,6 +551,26 @@ export const TacticsChat: React.FC = () => {
.
then
(()
=>
{
// 流结束时执行(通过 Promise resolve 判断,而不是 END 消息)
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
))
if
(
isNew
)
{
setTimeout
(()
=>
{
...
...
@@ -541,6 +581,26 @@ export const TacticsChat: React.FC = () => {
.
catch
((
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
))
})
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment