From c402a1d21f6faf58235bef5ade630edfd12e7a6f Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat Date: Fri, 9 May 2025 18:47:55 +0800 Subject: [PATCH] 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. --- src/renderer/src/store/thunk/messageThunk.ts | 75 +++++++++++--------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/src/renderer/src/store/thunk/messageThunk.ts b/src/renderer/src/store/thunk/messageThunk.ts index 866be35025..9c2e83cda3 100644 --- a/src/renderer/src/store/thunk/messageThunk.ts +++ b/src/renderer/src/store/thunk/messageThunk.ts @@ -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) => { - // 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) => { +// // 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]