javascript / intermediate
Snippet
Steuerung asynchroner Polling-Streams mit Async-Generatoren in React
Asynchrone Generatorfunktionen (`async function*`) bieten eine elegante Kontrollfluss-Struktur zur Erzeugung zeitlich aufeinanderfolgender Datenströme. In React-Effekten vereinfacht das Verarbeiten über `for await...of` die Polling-Logik und ermöglicht einen sauberen Abbruch beim Unmounten der Komponente.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import { useState, useEffect } from 'react';async function* pollStatus(jobId, intervalMs = 2000) {while (true) {const res = await fetch(`/api/jobs/${jobId}`);const data = await res.json();yield data;if (data.status === 'completed' || data.status === 'failed') break;await new Promise((resolve) => setTimeout(resolve, intervalMs));}}export function JobTracker({ jobId }) {const [job, setJob] = useState(null);useEffect(() => {let isCancelled = false;const generator = pollStatus(jobId);async function consume() {for await (const update of generator) {if (isCancelled) break;setJob(update);}}consume();return () => { isCancelled = true; };}, [jobId]);return <div>Status: {job ? job.status : 'Connecting...'}</div>;}
react
Erklärung
1
async function* pollStatus(jobId, intervalMs = 2000) {
Deklariert einen asynchronen Generator, der Datenströme schrittweise ausgeben und pausieren kann.
2
yield data;
Gibt die aktuell abgerufenen Daten an den Konsumenten weiter, ohne die Schleife zu beenden.
3
for await (const update of generator) {
Iteriert asynchron über jeden vom Generator gelieferten Wert, sobald das jeweilige Promise aufgelöst wird.