From 3bc284364245df300ada3ea9fbedb931bcadb32d Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 2 Jun 2026 03:48:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20browse=E5=BA=8F=E5=8F=B7=E4=BF=9D?= =?UTF-8?q?=E6=8A=A4=E9=98=B2=E6=AD=A2token=E5=88=B7=E6=96=B0=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E5=AF=BC=E8=87=B4=E7=9A=84=E5=8F=8C=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/FilesPage.vue | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/FilesPage.vue b/frontend/src/pages/FilesPage.vue index 918ba030..4b05fc70 100644 --- a/frontend/src/pages/FilesPage.vue +++ b/frontend/src/pages/FilesPage.vue @@ -851,8 +851,12 @@ function openInTerminal() { }) } +// 序号保护:防止并发/重试请求导致旧结果覆盖新结果 +let _browseSeq = 0 + async function browse() { if (!selectedServer.value) return + const seq = ++_browseSeq loading.value = true const path = normalizeRemotePath(currentPath.value) currentPath.value = path @@ -861,6 +865,8 @@ async function browse() { server_id: selectedServer.value, path, }) + // 如果期间启动了更新的 browse(token刷新重试/快速导航),丢弃本次结果 + if (seq !== _browseSeq) return const { items, error } = parseBrowseResponse(res) // Auto-fallback: if path doesn't exist, try parent directories automatically @@ -886,11 +892,14 @@ async function browse() { preloadDirectoryFiles(selectedServer.value, path, items) } } catch { + if (seq !== _browseSeq) return files.value = [] snackbar('浏览目录失败', 'error') } finally { - loading.value = false - syncRouteQuery() + if (seq === _browseSeq) { + loading.value = false + syncRouteQuery() + } } }