Ich plane gerade die Zustandsverwaltung für einen asynchronen Bild-Workflow im Browser und möchte eine Race Condition vermeiden.
Der Ablauf sieht vereinfacht so aus:
1. Der Nutzer wählt entweder ein einzelnes Referenzbild oder mehrere Bilder aus.
2. Die Uploads werden abgeschlossen und anschließend wird ein unveränderlicher Job angelegt.
3. Das Frontend fragt den Jobstatus per Polling ab: queued, processing, completed oder failed.
4. Nach completed werden Vorschau und Download freigeschaltet.
Problematisch wird es, wenn Job A noch läuft und der Nutzer bereits Job B startet oder zwischen Einzel- und Mehrbildmodus wechselt. Eine verspätete Antwort von Job A darf dann weder den Fortschritt noch die Vorschau von Job B überschreiben.
Ein möglicher Ansatz kombiniert eine lokale Request-Version mit der Job-ID:
```ts
const version = ++requestVersion.current;
const job = await createJob(request);
while (version === requestVersion.current) {
const result = await fetchJob(job.id, signal);
if (version !== requestVersion.current
result.id !== activeJobId.current) {
return;
}
dispatch({ type: "jobUpdated", result });
if (result.status === "completed"
result.status === "failed") return;
}
```
Beim Start eines neuen Jobs würde ich die Version erhöhen, alte Vorschauen löschen und offene Requests mit einem AbortController abbrechen. Der Versionsvergleich wäre trotzdem nötig, weil ein Abbruch allein bereits aufgelöste Promises oder spätere State-Updates nicht zuverlässig verhindert.
Ich überlege nun, ob diese Guards ausreichen oder ob der komplette Ablauf als kleiner Zustandsautomat modelliert werden sollte. Beim Zustandsautomaten könnten Ereignisse wie modeChanged, uploadCompleted, jobCreated, pollSucceeded, pollFailed und resultExpired nur in erlaubten Zuständen verarbeitet werden. Image to Image
Wie würdet ihr diesen Fall modellieren: Reducer/Zustandsautomat mit expliziter Generation des aktiven Jobs oder eine einfachere Promise-/Polling-Lösung mit Job-ID, Request-Version und AbortController? Besonders interessieren mich Fehlerfälle beim Moduswechsel und beim Ablauf eines bereits erzeugten Ergebnisses.
Es geht ausschließlich um die Frontend-Architektur; ein Produktlink oder eine Tool-Empfehlung ist dafür nicht nötig.