From 91c6e21b76bed24bc1cb4c0cbe9b4cf6d0ef6086 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 31 Jul 2026 12:19:30 +0800 Subject: [PATCH] fix: ignore stale class task responses --- src/views/teacherEnd/task/index.vue | 7 ++++++- tests/task-publication.static.test.cjs | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/views/teacherEnd/task/index.vue b/src/views/teacherEnd/task/index.vue index b29f045..fc52c3a 100644 --- a/src/views/teacherEnd/task/index.vue +++ b/src/views/teacherEnd/task/index.vue @@ -63,8 +63,10 @@ async function loadTasks() { tasks.value = []; return; } + const requestedClassId = classId.value; tasks.value = []; const res = await listClassTrainingTasks(classId.value, { enabledOnly: false }); + if (classId.value !== requestedClassId) return; tasks.value = res.data || []; } @@ -80,10 +82,13 @@ async function loadPublication() { selectedTaskKeys.value = []; configured.value = false; if (!classId.value) return; + const requestedClassId = classId.value; loading.value = true; try { await loadTasks(); - const res = await indexApi.getTaskPublication({ classId: classId.value }); + if (classId.value !== requestedClassId) return; + const res = await indexApi.getTaskPublication({ classId: requestedClassId }); + if (classId.value !== requestedClassId) return; configured.value = res.data?.configured === true; selectedTaskKeys.value = configured.value ? (res.data?.taskKeys || []) diff --git a/tests/task-publication.static.test.cjs b/tests/task-publication.static.test.cjs index 23e8054..9afa785 100644 --- a/tests/task-publication.static.test.cjs +++ b/tests/task-publication.static.test.cjs @@ -12,6 +12,8 @@ assert(taskPage.includes("listClassTrainingTasks"), "task allocation must use tr assert(taskPage.includes("listClassTrainingTasks"), "task allocation must load training tasks for the selected teaching class"); assert(taskPage.includes("await listClassTrainingTasks(classId.value, { enabledOnly: false })"), "class task loading must request disabled and enabled tasks"); assert(taskPage.includes("tasks.value = [];\n const res = await listClassTrainingTasks"), "class task loading must clear prior class rows before requesting the selected class"); +assert((taskPage.match(/const requestedClassId = classId\.value;/g) || []).length >= 2, "task and publication loading must capture the requested class"); +assert((taskPage.match(/if \(classId\.value !== requestedClassId\) return;/g) || []).length >= 2, "stale class requests must not update task rows or publication selection"); assert(taskPage.includes("getTaskPublication"), "task allocation must load the selected class publication state"); assert(taskPage.includes("tasks.value.map((task) => task.taskKey)"), "an unconfigured class must default to all tasks selected"); assert(taskPage.includes("保存发布配置"), "task allocation must require an explicit save");