Skip to content

race - Wählt den Stream aus, der zuerst einen Wert emittiert

race ist eine spezielle Kombinations-Creation Function, die nur das Observable am Leben hält, das zuerst einen Wert emittiert, und alle anderen Observables ignoriert.

Grundlegende Syntax und Verwendung

ts
import { race, timer } from 'rxjs';
import { map } from 'rxjs';

const slow$ = timer(5000).pipe(map(() => 'Langsam (5 Sekunden)'));
const fast$ = timer(2000).pipe(map(() => 'Schnell (2 Sekunden)'));

race(slow$, fast$).subscribe(console.log);
// Ausgabe: Schnell (2 Sekunden)
  • Nur das Observable, das zuerst einen Wert emittiert, wird zum Gewinner und setzt seinen Stream fort.
  • Andere Observables werden ignoriert.

🌐 RxJS Offizielle Dokumentation - race

Typische Anwendungsmuster

  • Verarbeitung der schnelleren von mehreren Benutzeraktionen (Klick, Tastatureingabe, Scrollen)
  • Verwendung des schnelleren von mehreren Triggern wie manuellem Senden und automatischem Speichern
  • Bevorzugte Anzeige der zuerst abgeschlossenen Daten von mehreren Datenabrufprozessen

Praktisches Codebeispiel (mit UI)

Simuliert ein Rennen, bei dem nur der erste emittierte Wert von drei Streams mit unterschiedlichem Timing ausgewählt wird.

ts
import { race, timer } from 'rxjs';
import { map } from 'rxjs';

// Ausgabebereich erstellen
const output = document.createElement('div');
output.innerHTML = '<h3>Praktisches Beispiel für race:</h3>';
document.body.appendChild(output);

// Observables mit unterschiedlichem Timing
const slow$ = timer(5000).pipe(map(() => 'Langsam (nach 5 Sekunden)'));
const medium$ = timer(3000).pipe(map(() => 'Mittel (nach 3 Sekunden)'));
const fast$ = timer(2000).pipe(map(() => 'Schnell (nach 2 Sekunden)'));

const startTime = Date.now();

// Rennstart-Nachricht
const waiting = document.createElement('div');
waiting.textContent = 'Rennen gestartet... Warten auf den ersten Stream, der emittiert.';
output.appendChild(waiting);

// race ausführen
race(slow$, medium$, fast$).subscribe(winner => {
  const endTime = Date.now();
  const elapsed = ((endTime - startTime) / 1000).toFixed(2);

  const result = document.createElement('div');
  result.innerHTML = `<strong>Gewinner:</strong> ${winner} (Verstrichene Zeit: ${elapsed} Sekunden)`;
  result.style.color = 'green';
  result.style.marginTop = '10px';
  output.appendChild(result);

  const explanation = document.createElement('div');
  explanation.textContent = '※ Nur das Observable, das zuerst einen Wert emittiert, wird ausgewählt.';
  explanation.style.marginTop = '5px';
  output.appendChild(explanation);
});
  • Nach 2 Sekunden emittiert fast$ zuerst und wird ab dann nur noch fast$ ausgegeben.
  • Die Emissionen von medium$ und slow$ werden ignoriert.

Verwandte Operatoren

  • raceWith - Pipeable Operator-Version (zur Verwendung in Pipelines)
  • timeout - Spezieller Timeout-Operator
  • merge - Creation Function zum Zusammenführen aller Streams

Veröffentlicht unter CC-BY-4.0-Lizenz.