mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-24 10:40:07 +08:00
refactor: optimize block update logic and remove unused code
- Updated `throttledBlockUpdate` to handle asynchronous updates directly. - Removed the unused `throttledBlockDbUpdate` function and its related logic. - Added cancellation for throttled updates on error and completion to improve performance and reliability. - Cleaned up commented-out code for better readability.
This commit is contained in:
parent
6da1d08c9a
commit
c402a1d21f
@ -106,44 +106,46 @@ const updateExistingMessageAndBlocksInDB = async (
|
||||
}
|
||||
|
||||
// 更新单个块的逻辑,用于更新消息中的单个块
|
||||
const throttledBlockUpdate = throttle((id, blockUpdate) => {
|
||||
const state = store.getState()
|
||||
const block = state.messageBlocks.entities[id]
|
||||
const throttledBlockUpdate = throttle(async (id, blockUpdate) => {
|
||||
// const state = store.getState()
|
||||
// const block = state.messageBlocks.entities[id]
|
||||
// throttle是异步函数,可能会在complete事件触发后才执行
|
||||
if (
|
||||
blockUpdate.status === MessageBlockStatus.STREAMING &&
|
||||
(block?.status === MessageBlockStatus.SUCCESS || block?.status === MessageBlockStatus.ERROR)
|
||||
)
|
||||
return
|
||||
// if (
|
||||
// blockUpdate.status === MessageBlockStatus.STREAMING &&
|
||||
// (block?.status === MessageBlockStatus.SUCCESS || block?.status === MessageBlockStatus.ERROR)
|
||||
// )
|
||||
// return
|
||||
|
||||
store.dispatch(updateOneBlock({ id, changes: blockUpdate }))
|
||||
await db.message_blocks.update(id, blockUpdate)
|
||||
}, 150)
|
||||
|
||||
// 修改: 节流更新单个块的内容/状态到数据库 (仅用于 Text/Thinking Chunks)
|
||||
export const throttledBlockDbUpdate = throttle(
|
||||
async (blockId: string, blockChanges: Partial<MessageBlock>) => {
|
||||
// Check if blockId is valid before attempting update
|
||||
if (!blockId) {
|
||||
console.warn('[DB Throttle Block Update] Attempted to update with null/undefined blockId. Skipping.')
|
||||
return
|
||||
}
|
||||
const state = store.getState()
|
||||
const block = state.messageBlocks.entities[blockId]
|
||||
// throttle是异步函数,可能会在complete事件触发后才执行
|
||||
if (
|
||||
blockChanges.status === MessageBlockStatus.STREAMING &&
|
||||
(block?.status === MessageBlockStatus.SUCCESS || block?.status === MessageBlockStatus.ERROR)
|
||||
)
|
||||
return
|
||||
try {
|
||||
await db.message_blocks.update(blockId, blockChanges)
|
||||
} catch (error) {
|
||||
console.error(`[DB Throttle Block Update] Failed for block ${blockId}:`, error)
|
||||
}
|
||||
},
|
||||
300, // 可以调整节流间隔
|
||||
{ leading: false, trailing: true }
|
||||
)
|
||||
const cancelThrottledBlockUpdate = throttledBlockUpdate.cancel
|
||||
|
||||
// // 修改: 节流更新单个块的内容/状态到数据库 (仅用于 Text/Thinking Chunks)
|
||||
// export const throttledBlockDbUpdate = throttle(
|
||||
// async (blockId: string, blockChanges: Partial<MessageBlock>) => {
|
||||
// // Check if blockId is valid before attempting update
|
||||
// if (!blockId) {
|
||||
// console.warn('[DB Throttle Block Update] Attempted to update with null/undefined blockId. Skipping.')
|
||||
// return
|
||||
// }
|
||||
// const state = store.getState()
|
||||
// const block = state.messageBlocks.entities[blockId]
|
||||
// // throttle是异步函数,可能会在complete事件触发后才执行
|
||||
// if (
|
||||
// blockChanges.status === MessageBlockStatus.STREAMING &&
|
||||
// (block?.status === MessageBlockStatus.SUCCESS || block?.status === MessageBlockStatus.ERROR)
|
||||
// )
|
||||
// return
|
||||
// try {
|
||||
// } catch (error) {
|
||||
// console.error(`[DB Throttle Block Update] Failed for block ${blockId}:`, error)
|
||||
// }
|
||||
// },
|
||||
// 300, // 可以调整节流间隔
|
||||
// { leading: false, trailing: true }
|
||||
// )
|
||||
|
||||
// 新增: 通用的、非节流的函数,用于保存消息和块的更新到数据库
|
||||
const saveUpdatesToDB = async (
|
||||
@ -338,7 +340,7 @@ const fetchAndProcessAssistantResponseImpl = async (
|
||||
status: MessageBlockStatus.STREAMING
|
||||
}
|
||||
throttledBlockUpdate(lastBlockId, blockChanges)
|
||||
throttledBlockDbUpdate(lastBlockId, blockChanges)
|
||||
// throttledBlockDbUpdate(lastBlockId, blockChanges)
|
||||
} else {
|
||||
const newBlock = createMainTextBlock(assistantMsgId, accumulatedContent, {
|
||||
status: MessageBlockStatus.STREAMING,
|
||||
@ -396,7 +398,7 @@ const fetchAndProcessAssistantResponseImpl = async (
|
||||
thinking_millsec: thinking_millsec
|
||||
}
|
||||
throttledBlockUpdate(lastBlockId, blockChanges)
|
||||
throttledBlockDbUpdate(lastBlockId, blockChanges)
|
||||
// throttledBlockDbUpdate(lastBlockId, blockChanges)
|
||||
} else {
|
||||
const newBlock = createThinkingBlock(assistantMsgId, accumulatedThinking, {
|
||||
status: MessageBlockStatus.STREAMING,
|
||||
@ -540,6 +542,7 @@ const fetchAndProcessAssistantResponseImpl = async (
|
||||
}
|
||||
},
|
||||
onError: async (error) => {
|
||||
cancelThrottledBlockUpdate()
|
||||
console.dir(error, { depth: null })
|
||||
const isErrorTypeAbort = isAbortError(error)
|
||||
let pauseErrorLanguagePlaceholder = ''
|
||||
@ -581,6 +584,8 @@ const fetchAndProcessAssistantResponseImpl = async (
|
||||
})
|
||||
},
|
||||
onComplete: async (status: AssistantMessageStatus, response?: Response) => {
|
||||
cancelThrottledBlockUpdate()
|
||||
|
||||
const finalStateOnComplete = getState()
|
||||
const finalAssistantMsg = finalStateOnComplete.messages.entities[assistantMsgId]
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user