diff --git a/frontend/src/views/ProductListView.vue b/frontend/src/views/ProductListView.vue index dc3e7b7..8a29e94 100644 --- a/frontend/src/views/ProductListView.vue +++ b/frontend/src/views/ProductListView.vue @@ -552,6 +552,30 @@ const taskPercent = computed(() => { return total > 0 ? Math.round((Number(taskProgress.value.done || 0) / total) * 100) : 0 }) let taskPollTimer = 0 +let taskListRefreshPending = false +let taskListRefreshPromise = null + +function refreshTaskListAfterProgress() { + taskListRefreshPending = true + if (!taskListRefreshPromise) { + taskListRefreshPromise = (async () => { + while (taskListRefreshPending) { + taskListRefreshPending = false + await search(false) + } + })().finally(() => { + taskListRefreshPromise = null + if (taskListRefreshPending) refreshTaskListAfterProgress() + }) + } + return taskListRefreshPromise +} + +async function refreshTaskListAtFinish() { + // 等待进度事件触发的查询,避免它晚于最终查询返回并覆盖最终状态。 + while (taskListRefreshPromise) await taskListRefreshPromise + await search(false) +} function formatElapsed(seconds) { const value = Math.max(0, Number(seconds || 0)) @@ -637,7 +661,7 @@ function applyTaskProgress(progress) { async function refreshTaskProgress() { try { - applyTaskProgress(await GetVideoTaskProgress()) + onTaskProgress(await GetVideoTaskProgress()) } catch (err) { // 轮询只是事件漏收时的兜底,不重复弹错打断使用者。 console.warn('读取批量任务进度失败', err) @@ -683,13 +707,15 @@ async function stopVideoTask() { } function onTaskProgress(progress) { + const completedMore = Number(progress?.done || 0) > Number(taskProgress.value.done || 0) applyTaskProgress(progress) + if (completedMore) refreshTaskListAfterProgress() } async function onTaskFinished(progress) { applyTaskProgress(progress) taskStopping.value = false - await search(false) + await refreshTaskListAtFinish() if (progress?.state === 'stopped') { message.warning(`任务已停止,已处理 ${progress.done || 0}/${progress.total || 0}`) } else { @@ -710,7 +736,7 @@ function goToSettings() { async function onTaskLoginRequired(progress) { applyTaskProgress(progress) taskStopping.value = false - await search(false) + await refreshTaskListAtFinish() const riskSuspected = progress?.stopReason === 'risk_suspected' const riskBlocked = progress?.stopReason === 'risk_blocked' dialog.warning({