diff --git a/web/frontend/src/pages/LoginTasksPage.tsx b/web/frontend/src/pages/LoginTasksPage.tsx index a33c7f9..e396b28 100644 --- a/web/frontend/src/pages/LoginTasksPage.tsx +++ b/web/frontend/src/pages/LoginTasksPage.tsx @@ -78,7 +78,8 @@ export default function LoginTasksPage() { return localStorage.getItem('login_api_strategy') || 'wgapi'; }); const [settingsOpen, setSettingsOpen] = useState(false); - const tasksLoadingRef = useRef(false); + // 任务列表请求序号:保证「最新一次请求」的结果才落到界面上。 + const taskRequestRef = useRef(0); const accountPageRequestRef = useRef(0); const tagSelectionRequestRef = useRef(0); const [tagAccountIds, setTagAccountIds] = useState>({}); @@ -206,8 +207,9 @@ export default function LoginTasksPage() { }, [loadAllAccountsByTag, selectedTags]); const loadTasks = useCallback(async () => { - if (tasksLoadingRef.current) return; - tasksLoadingRef.current = true; + // 「最新请求获胜」而不是「有请求在跑就丢弃」:轮询请求在途时用户点了翻页, + // 旧写法会把这次翻页请求直接吞掉,页面停在上一页直到下次轮询。 + const reqId = ++taskRequestRef.current; try { const data = await loginApi.listTasksPaged({ page: taskPage, @@ -215,12 +217,11 @@ export default function LoginTasksPage() { batch_id: batchId || undefined, status: taskStatus || undefined, }); + if (reqId !== taskRequestRef.current) return; // 已有更新的请求,丢弃本次结果 setTasks(data.items); setTaskTotal(data.total); } catch { // 忽略轮询失败,下一次定时刷新会继续尝试。 - } finally { - tasksLoadingRef.current = false; } }, [batchId, taskPage, taskPageSize, taskStatus]);