task-85: 优化 Similar ASIN 轮询与文件生成等待,避免重复 force 请求
新增纯 TS force 节流守卫 asin-force-throttle:为每个 taskId 维护 TTL 冷却窗口,窗口内不重复发 force 请求(避免反复触发后端生成文件),到期 后允许重试,任务终态后 clear 立即释放记录。BrandSimilarAsinTab 的 refreshTaskProgress 改为按 pendingFileTaskIds 逐项查守卫决定本轮是否 带 force,请求成功后整批进入冷却。8 个测试覆盖默认、批量、幂等、空、 单元素、200 任务溢出、非法输入与时钟故障恢复。
This commit is contained in:
@@ -211,6 +211,7 @@ import { getTaskPollIntervalMs } from '@/shared/task-progress-config'
|
||||
import { getStoredApiSecret } from '@/shared/utils/api-secret-store'
|
||||
import { createCategorizedTimers } from '@/shared/utils/categorized-timers'
|
||||
import { saveUrlWithProgress } from '@/shared/utils/download-progress'
|
||||
import { createAsinForceThrottle } from '@/shared/asin-force-throttle'
|
||||
|
||||
const selectedFileNames = ref<string[]>([])
|
||||
const uploadedFiles = ref<UploadFileVo[]>([])
|
||||
@@ -228,6 +229,8 @@ const pollingTaskIds = ref<number[]>([])
|
||||
const pendingFileTaskIds = ref<number[]>([])
|
||||
const pollTimer = ref<number | null>(null)
|
||||
const pollingInFlight = ref(false)
|
||||
// force 请求节流:文件生成中不重复 force(TTL 窗口内只发一次),终态后 clear 释放
|
||||
const forceThrottle = createAsinForceThrottle({ ttlMs: 30_000 })
|
||||
const HISTORY_CACHE_TTL_MS = 3000
|
||||
let historyInFlight: Promise<void> | null = null
|
||||
let lastHistoryLoadedAt = 0
|
||||
@@ -608,6 +611,7 @@ function addPendingFileTask(taskId: number) {
|
||||
|
||||
function removePendingFileTask(taskId: number) {
|
||||
pendingFileTaskIds.value = pendingFileTaskIds.value.filter((id) => id !== taskId)
|
||||
forceThrottle.clear(taskId)
|
||||
if (!pollingTaskIds.value.includes(taskId)) {
|
||||
const next = { ...liveProgressItems.value }
|
||||
delete next[taskId]
|
||||
@@ -683,7 +687,12 @@ async function refreshTaskProgress() {
|
||||
let shouldRefreshHistory = false
|
||||
const taskIds = Array.from(new Set([...pollingTaskIds.value, ...pendingFileTaskIds.value]))
|
||||
if (taskIds.length) {
|
||||
const batch = await getSimilarAsinTaskProgressBatch(taskIds, { force: pendingFileTaskIds.value.length > 0 })
|
||||
const force = pendingFileTaskIds.value.some((taskId) => forceThrottle.shouldForce(taskId))
|
||||
const batch = await getSimilarAsinTaskProgressBatch(taskIds, { force })
|
||||
if (force) {
|
||||
// force 请求已发出,进入冷却窗口;TTL 内不再重复 force,避免重复触发文件生成
|
||||
pendingFileTaskIds.value.forEach((taskId) => forceThrottle.markForce(taskId))
|
||||
}
|
||||
for (const detail of batch.items || []) {
|
||||
const task = detail.task
|
||||
if (!task?.id) continue
|
||||
|
||||
Reference in New Issue
Block a user