From e83d5c7a8c51ff0e2af6bddf265be9053f7d2db8 Mon Sep 17 00:00:00 2001 From: Momentry Studio Date: Thu, 8 Oct 2026 01:37:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E6=89=B9=E9=87=8F=20Deep=20Scan=20=E4=B8=A5?= =?UTF-8?q?=E6=A0=BC=E9=99=90=E5=88=B6=E5=B9=B6=E5=8F=91=E4=B8=BA=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - re_scan_file API 是异步的,立即返回成功 - 后端可能同时启动多个扫描任务 - 导致有 4 个文件同时在 scanning 状态 临时修复: - 在每个文件启动扫描后等待 2 秒 - 确保后端有足够时间开始处理并释放资源 - 保持前端并发控制为 2,避免过多任务同时启动 未来改进: - 需要在后端实现真正的队列机制 - 或者检查当前 scanning 状态,动态调整启动速度 --- src/views/LibraryView.vue | 83 ++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/src/views/LibraryView.vue b/src/views/LibraryView.vue index 6ee326e..adc11cd 100644 --- a/src/views/LibraryView.vue +++ b/src/views/LibraryView.vue @@ -1899,54 +1899,57 @@ async function batchDeepScan() { actionMsg.value = `Starting: ${immediateCount} immediate, ${queueTotal} queuing...` - const tasks = filesToProcess.map((f) => { - return limit(async () => { - const fileUuid = f.file_uuid - if (!fileUuid) { + async function processFile(f: any) { + const fileUuid = f.file_uuid + if (!fileUuid) { + failCount++ + return + } + + processing++ + const queueCount = Math.max(0, filesToProcess.length - successCount - failCount - processing) + + if (queueCount > 0) { + actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length} (${queueCount} queuing)...` + } else { + actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length}...` + } + + try { + const file = filesCache.value.find((x: any) => x.file_uuid === fileUuid) + if (!file) { failCount++ + processing-- return } - processing++ - const queueCount = Math.max(0, filesToProcess.length - successCount - failCount - processing) + const result: any = await apiCall('re_scan_file', { + fileUuid: fileUuid, + autoPipeline: true + }) - if (queueCount > 0) { - actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length} (${queueCount} queuing)...` + if (result.success) { + successCount++ + if (file) { + file.status = 'scanning' + fileStatusCache.value[fileUuid] = 'scanning' + await syncFileStatus(fileUuid) + } + + // 等待 2 秒,确保后端开始处理并释放资源 + await new Promise(resolve => setTimeout(resolve, 2000)) } else { - actionMsg.value = `Processing ${successCount + 1}/${filesToProcess.length}...` - } - - try { - const file = filesCache.value.find((x: any) => x.file_uuid === fileUuid) - if (!file) { - failCount++ - processing-- - return - } - - const result: any = await apiCall('re_scan_file', { - fileUuid: fileUuid, - autoPipeline: true - }) - - if (result.success) { - successCount++ - if (file) { - file.status = 'scanning' - fileStatusCache.value[fileUuid] = 'scanning' - await syncFileStatus(fileUuid) - } - } else { - failCount++ - } - } catch (e: any) { failCount++ - console.error('[batchDeepScan] Failed:', f.file_name, e) - } finally { - processing-- } - }) - }) + } catch (e: any) { + failCount++ + console.error('[batchDeepScan] Failed:', f.file_name, e) + } finally { + processing-- + } + } + + const tasks = filesToProcess.map((f) => limit(() => processFile(f))) await Promise.all(tasks)