feat: improve schedule cleanup and handover
This commit is contained in:
@@ -234,9 +234,6 @@ export default function SchedulePage({
|
||||
void useSchedulesStore.getState().loadInitial();
|
||||
}, [workspaceId, api, setSchedules, setArtifacts, setSchedule]);
|
||||
|
||||
// 进入调度页或切换调度方案后,主动加载该方案已经存在的运行记录。
|
||||
// 原先只有「手动运行」和运行中的轮询会更新列表,因此从其他页面返回时会
|
||||
// 一直停留在加载状态,直到产生新的运行记录。
|
||||
useEffect(() => {
|
||||
const scheduleId = schedule?.schedule_id;
|
||||
if (!scheduleId || !api) {
|
||||
@@ -244,35 +241,32 @@ export default function SchedulePage({
|
||||
setRunsLoading(false);
|
||||
return;
|
||||
}
|
||||
void useSchedulesStore.getState().refreshRuns(scheduleId, true);
|
||||
}, [schedule?.schedule_id, api, setRuns, setRunsLoading]);
|
||||
|
||||
useEffect(() => {
|
||||
const scheduleId = schedule?.schedule_id;
|
||||
if (!scheduleId || !api) return;
|
||||
let timer: number | undefined;
|
||||
let cancelled = false;
|
||||
const tick = (): void => {
|
||||
const tick = async (showLoading = false): Promise<void> => {
|
||||
if (cancelled) return;
|
||||
void useSchedulesStore.getState().refreshRuns(scheduleId);
|
||||
// 每次 tick 重新读最新 runs,不再把 runs 放进依赖数组,避免每次 setRuns
|
||||
// 都触发 effect cleanup + 重建 setInterval。
|
||||
// 必须等待请求完成再判断状态;旧实现会在首个请求返回前看到空数组,
|
||||
// 因而错误地停止轮询,导致运行记录必须手工刷新才出现。
|
||||
await useSchedulesStore.getState().refreshRuns(scheduleId, showLoading);
|
||||
if (cancelled || useSchedulesStore.getState().schedule?.schedule_id !== scheduleId) {
|
||||
return;
|
||||
}
|
||||
const runs = useSchedulesStore.getState().runs;
|
||||
const hasActiveRun = runs.some(
|
||||
(item) => item.run_status === "queued" || item.run_status === "running",
|
||||
);
|
||||
const isEnabledCron = schedule.trigger_type === "cron" && schedule.enabled;
|
||||
// Cron 会由后端在未来某个整分钟创建新记录。即使当前没有运行中的
|
||||
// 记录,也要持续刷新,才能让新一轮运行自动出现在右侧列表中。
|
||||
if (!hasActiveRun && !isEnabledCron) return;
|
||||
timer = window.setTimeout(tick, hasActiveRun ? 1500 : 3000);
|
||||
// 页面停留期间持续刷新:运行中更快,空闲时较慢,既能自动显示 Cron
|
||||
// 新记录,也不会因频繁请求影响其他调度页面操作。
|
||||
timer = window.setTimeout(() => {
|
||||
void tick();
|
||||
}, hasActiveRun ? 1500 : 5000);
|
||||
};
|
||||
tick();
|
||||
void tick(true);
|
||||
return () => {
|
||||
cancelled = true;
|
||||
if (timer !== undefined) window.clearTimeout(timer);
|
||||
};
|
||||
}, [schedule?.schedule_id, schedule?.trigger_type, schedule?.enabled, api]);
|
||||
}, [schedule?.schedule_id, api, setRuns, setRunsLoading]);
|
||||
|
||||
// Form submit wrapper for create-schedule modal — keeps the FormEvent flow out of JSX.
|
||||
const handleCreateScheduleSubmit = (event: FormEvent<HTMLFormElement>): void => {
|
||||
|
||||
Reference in New Issue
Block a user