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
984a54ba
Commit
984a54ba
authored
Jan 05, 2026
by
Liu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix:调用顺序
parent
e254a080
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
169 additions
and
4 deletions
+169
-4
src/components/ChatEditor/index.tsx
+84
-0
src/pages/Chat/Chat.tsx
+85
-4
No files found.
src/components/ChatEditor/index.tsx
View file @
984a54ba
...
@@ -44,9 +44,89 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
...
@@ -44,9 +44,89 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
const
toolIdFromUrl
=
searchParams
.
get
(
'toolId'
)
const
toolIdFromUrl
=
searchParams
.
get
(
'toolId'
)
const
fromCollect
=
location
.
state
?.
fromCollect
const
fromCollect
=
location
.
state
?.
fromCollect
/** 等待 token 就绪,确保登录接口返回后才继续 */
const
waitForToken
=
async
(
maxWaitTime
=
3000
):
Promise
<
boolean
>
=>
{
const
startTime
=
Date
.
now
()
let
initialToken
=
''
// 先获取初始 token 值
try
{
const
initialTokenStr
=
window
.
localStorage
.
getItem
(
'__TOKEN__'
)
||
'""'
initialToken
=
JSON
.
parse
(
initialTokenStr
)
||
''
}
catch
{
initialToken
=
''
}
// 如果初始没有 token,等待 token 出现(从无到有,说明登录完成)
if
(
!
initialToken
)
{
while
(
Date
.
now
()
-
startTime
<
maxWaitTime
)
{
const
tokenStr
=
window
.
localStorage
.
getItem
(
'__TOKEN__'
)
||
'""'
let
token
=
''
try
{
token
=
JSON
.
parse
(
tokenStr
)
||
''
}
catch
{
token
=
''
}
if
(
token
)
{
// token 从无到有,说明登录完成,再等待一小段时间确保写入完成
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
200
))
return
true
}
// 等待 100ms 后再次检查
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
100
))
}
return
false
}
// 如果初始有 token,可能是旧 token 或新 token
// 等待一小段时间,确保登录流程有足够时间完成(登录接口可能会更新 token)
// 同时监听 token 变化
let
tokenChanged
=
false
const
checkTokenChange
=
()
=>
{
try
{
const
currentTokenStr
=
window
.
localStorage
.
getItem
(
'__TOKEN__'
)
||
'""'
const
currentToken
=
JSON
.
parse
(
currentTokenStr
)
||
''
if
(
currentToken
&&
currentToken
!==
initialToken
)
{
tokenChanged
=
true
}
}
catch
{
// 忽略解析错误
}
}
// 监听 storage 事件(跨标签页)
window
.
addEventListener
(
'storage'
,
checkTokenChange
)
// 轮询检查(同标签页)
const
interval
=
setInterval
(
checkTokenChange
,
100
)
// 等待最多 1 秒,检测 token 是否变化
const
waitForChange
=
new
Promise
<
void
>
((
resolve
)
=>
{
setTimeout
(()
=>
{
window
.
removeEventListener
(
'storage'
,
checkTokenChange
)
clearInterval
(
interval
)
resolve
()
},
1000
)
})
await
waitForChange
// 如果 token 变化了,说明登录完成,再等待一小段时间确保写入完成
if
(
tokenChanged
)
{
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
200
))
return
true
}
// 如果 token 没有变化,可能是已经登录完成,但为了确保登录流程完成,再等待一小段时间
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
300
))
return
true
}
// 获取工具列表
// 获取工具列表
const
getToolList
=
async
()
=>
{
const
getToolList
=
async
()
=>
{
try
{
try
{
// 等待 token 就绪后再调用接口
await
waitForToken
()
// 从路由中获取 userRoles 参数
// 从路由中获取 userRoles 参数
const
userRoles
=
getUserRolesForApi
()
const
userRoles
=
getUserRolesForApi
()
// 调用真实 API 获取工具列表
// 调用真实 API 获取工具列表
...
@@ -239,6 +319,8 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
...
@@ -239,6 +319,8 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
// 先调用 fetchSessionConversationId 获取会话ID
// 先调用 fetchSessionConversationId 获取会话ID
try
{
try
{
// 等待 token 就绪后再调用接口
await
waitForToken
()
const
requestData
=
{
const
requestData
=
{
busiId
:
''
,
busiId
:
''
,
}
}
...
@@ -284,6 +366,8 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
...
@@ -284,6 +366,8 @@ const ChatEditorBase: React.FC<ChatEditorProps & WithAuthProps> = ({ checkAuth,
// 先调用 fetchSessionConversationId 获取会话ID
// 先调用 fetchSessionConversationId 获取会话ID
try
{
try
{
// 等待 token 就绪后再调用接口
await
waitForToken
()
const
requestData
=
{
const
requestData
=
{
busiId
:
tool
.
toolId
,
busiId
:
tool
.
toolId
,
}
}
...
...
src/pages/Chat/Chat.tsx
View file @
984a54ba
...
@@ -401,6 +401,84 @@ export const Chat: React.FC = () => {
...
@@ -401,6 +401,84 @@ export const Chat: React.FC = () => {
scrollableRef
.
current
.
scrollTo
(
scrollableRef
.
current
.
scrollHeight
,
{
behavior
:
'smooth'
})
scrollableRef
.
current
.
scrollTo
(
scrollableRef
.
current
.
scrollHeight
,
{
behavior
:
'smooth'
})
}
}
/** 等待 token 就绪,确保登录接口返回后才继续 */
const
waitForToken
=
async
(
maxWaitTime
=
3000
):
Promise
<
boolean
>
=>
{
const
startTime
=
Date
.
now
()
let
initialToken
=
''
// 先获取初始 token 值
try
{
const
initialTokenStr
=
window
.
localStorage
.
getItem
(
'__TOKEN__'
)
||
'""'
initialToken
=
JSON
.
parse
(
initialTokenStr
)
||
''
}
catch
{
initialToken
=
''
}
// 如果初始没有 token,等待 token 出现(从无到有,说明登录完成)
if
(
!
initialToken
)
{
while
(
Date
.
now
()
-
startTime
<
maxWaitTime
)
{
const
tokenStr
=
window
.
localStorage
.
getItem
(
'__TOKEN__'
)
||
'""'
let
token
=
''
try
{
token
=
JSON
.
parse
(
tokenStr
)
||
''
}
catch
{
token
=
''
}
if
(
token
)
{
// token 从无到有,说明登录完成,再等待一小段时间确保写入完成
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
200
))
return
true
}
// 等待 100ms 后再次检查
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
100
))
}
return
false
}
// 如果初始有 token,可能是旧 token 或新 token
// 等待一小段时间,确保登录流程有足够时间完成(登录接口可能会更新 token)
// 同时监听 token 变化
let
tokenChanged
=
false
const
checkTokenChange
=
()
=>
{
try
{
const
currentTokenStr
=
window
.
localStorage
.
getItem
(
'__TOKEN__'
)
||
'""'
const
currentToken
=
JSON
.
parse
(
currentTokenStr
)
||
''
if
(
currentToken
&&
currentToken
!==
initialToken
)
{
tokenChanged
=
true
}
}
catch
{
// 忽略解析错误
}
}
// 监听 storage 事件(跨标签页)
window
.
addEventListener
(
'storage'
,
checkTokenChange
)
// 轮询检查(同标签页)
const
interval
=
setInterval
(
checkTokenChange
,
100
)
// 等待最多 1 秒,检测 token 是否变化
const
waitForChange
=
new
Promise
<
void
>
((
resolve
)
=>
{
setTimeout
(()
=>
{
window
.
removeEventListener
(
'storage'
,
checkTokenChange
)
clearInterval
(
interval
)
resolve
()
},
1000
)
})
await
waitForChange
// 如果 token 变化了,说明登录完成,再等待一小段时间确保写入完成
if
(
tokenChanged
)
{
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
200
))
return
true
}
// 如果 token 没有变化,可能是已经登录完成,但为了确保登录流程完成,再等待一小段时间
await
new
Promise
(
resolve
=>
setTimeout
(
resolve
,
300
))
return
true
}
useEffect
(()
=>
{
useEffect
(()
=>
{
if
(
id
)
{
if
(
id
)
{
// 停止之前的请求
// 停止之前的请求
...
@@ -411,7 +489,11 @@ export const Chat: React.FC = () => {
...
@@ -411,7 +489,11 @@ export const Chat: React.FC = () => {
currentIdRef
.
current
=
id
currentIdRef
.
current
=
id
lastSentQuestionRef
.
current
=
''
// 重置标记
lastSentQuestionRef
.
current
=
''
// 重置标记
getUserQaRecordPage
(
id
)
// 等待 token 就绪后再调用接口
waitForToken
().
then
(()
=>
{
getUserQaRecordPage
(
id
)
})
}
}
},
[
id
])
},
[
id
])
...
@@ -438,9 +520,8 @@ export const Chat: React.FC = () => {
...
@@ -438,9 +520,8 @@ export const Chat: React.FC = () => {
const
getToolNameFromToolId
=
async
()
=>
{
const
getToolNameFromToolId
=
async
()
=>
{
if
(
currentToolId
)
{
if
(
currentToolId
)
{
try
{
try
{
// 使用mock数据(已注释)
// 等待 token 就绪后再调用接口
// const res = await mockFetchToolList()
await
waitForToken
()
// 真实API调用
const
userRoles
=
getUserRolesForApi
()
const
userRoles
=
getUserRolesForApi
()
const
res
=
await
fetchToolList
({
userRoles
})
const
res
=
await
fetchToolList
({
userRoles
})
if
(
res
?.
data
)
{
if
(
res
?.
data
)
{
...
...
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