返回 DeepSeek-Reasonix
serialWorkspacePoll.ts
根目录 / desktop / frontend / src / lib / serialWorkspacePoll.ts
1 export interface PollClock {
2 schedule(callback: () => void, delay: number): unknown;
3 cancel(handle: unknown): void;
4 }
5
6 export function createSerialWorkspacePoll(clock: PollClock, interval = 5000) {
7 let job: (() => Promise<void>) | null = null;
8 let timer: unknown = null;
9 let running = false;
10 let pending = false;
11 const clear = () => {
12 if (timer !== null) clock.cancel(timer);
13 timer = null;
14 };
15 const run = () => {
16 clear();
17 if (!job) return;
18 if (running) { pending = true; return; }
19 const current = job;
20 running = true;
21 pending = false;
22 void Promise.resolve().then(() => job === current ? current() : undefined).catch(() => {}).finally(() => {
23 running = false;
24 if (!job) return;
25 if (pending || job !== current) run();
26 else timer = clock.schedule(run, interval);
27 });
28 };
29 return {
30 setJob(next: (() => Promise<void>) | null) {
31 clear();
32 job = next;
33 pending = false;
34 if (job) run();
35 },
36 refresh: run,
37 };
38 }
39
39 lines TYPESCRIPT