diff --git a/src/views/conversationHistoryBar.ts b/src/views/conversationHistoryBar.ts index 1e8cde0..80e5785 100644 --- a/src/views/conversationHistoryBar.ts +++ b/src/views/conversationHistoryBar.ts @@ -303,6 +303,7 @@ export function getConversationHistoryBarScript(): string { let totalHistory = 0; let hasMoreHistory = false; let isLoadingHistory = false; + let currentLoadRequestId = 0; // 请求 ID,用于防止并发加载 const HISTORY_PAGE_SIZE = 10; const MAX_HISTORY_ITEMS = 100; @@ -346,11 +347,15 @@ export function getConversationHistoryBarScript(): string { return; } + // 生成新的请求 ID,用于防止并发加载 + const requestId = ++currentLoadRequestId; + isLoadingHistory = true; vscode.postMessage({ command: 'loadConversationHistory', offset: currentOffset, - limit: HISTORY_PAGE_SIZE + limit: HISTORY_PAGE_SIZE, + requestId: requestId }); } @@ -362,11 +367,19 @@ export function getConversationHistoryBarScript(): string { return; } - // 追加新数据 - conversationHistory = conversationHistory.concat(data.items); + // 追加新数据(去重) + const existingIds = new Set(conversationHistory.map(item => item.id)); + const newItems = []; + for (const item of data.items) { + if (!existingIds.has(item.id)) { + existingIds.add(item.id); + newItems.push(item); + } + } + conversationHistory = conversationHistory.concat(newItems); totalHistory = data.total; hasMoreHistory = data.hasMore; - currentOffset += data.items.length; + currentOffset = conversationHistory.length; const historyList = document.getElementById('historyList'); if (!historyList) { @@ -454,9 +467,10 @@ export function getConversationHistoryBarScript(): string { }); } - // 监听下拉菜单滚动事件 + // 监听下拉菜单滚动事件(防止重复注册) const historyDropdownMenu = document.getElementById('historyDropdownMenu'); - if (historyDropdownMenu) { + if (historyDropdownMenu && !historyDropdownMenu._scrollListenerAdded) { + historyDropdownMenu._scrollListenerAdded = true; historyDropdownMenu.addEventListener('scroll', () => { const menu = historyDropdownMenu; const scrollTop = menu.scrollTop;