Skip to content

combineLatestAll - kombiniert die letzten Werte des internen Observable

Der Operator "combineLatestAll" nimmt ein Observable höherer Ordnung (Observable of Observables), Wenn alle internen Observable mindestens einmal ausgelöst haben, werden die letzten Werte jedes Observable kombiniert und als Array ausgegeben.

🔰 Grundlegende Syntax und Verwendung

ts
import { interval, of } from 'rxjs';
import { combineLatestAll, take } from 'rxjs';

// 3Zwei interneObservablemitHigher-order Observable
const higherOrder$ = of(
  interval(1000).pipe(take(3)), // 0, 1, 2
  interval(500).pipe(take(4)),  // 0, 1, 2, 3
  interval(2000).pipe(take(2))  // 0, 1
);

// Alle internenObservablehaben mindestens1einmal gefeuert, kombinieren Sie die letzten Werte
higherOrder$
  .pipe(combineLatestAll())
  .subscribe(values => console.log(values));

// Ausgabe:
// [1, 3, 0] ← Wenn alle mindestens einmal gezündet haben1Wenn alle mindestens einmal gezündet haben (nach2Sekunden später)
// [2, 3, 0] ← 1Wenn der zweiteObservableabgefeuert wird (nach 2 Sekunden)2feuert (nach3Sekunden später)
// [2, 3, 1] ← 3Wenn der zweiteObservableabgefeuert wird (nach 2 Sekunden)1feuert (nach4Sekunden später)
  • Interne Observables sammeln, wenn Observable höherer Ordnung vollständig ist.
  • Beginnen Sie mit dem Kombinieren, wenn alle internen Observable mindestens einmal ausgelöst haben.
  • Immer wenn eine interne Observable einen Wert ausgibt, kombinieren Sie alle letzten Werte und Ausgaben.

🌐 Offizielle RxJS Dokumentation - combineLatestAll

💡 Typisches Nutzungsmuster.

  • Die neuesten Ergebnisse mehrerer API-Aufrufe zusammenfassen
  • Synchronisieren der letzten Werte mehrerer Formulareingaben
  • Mehrere Echtzeit-Datenquellen einbinden

🧠 Praktische Code-Beispiele

Beispiel für die Kombination der letzten Ergebnisse mehrerer API-Aufrufe

ts
import { of, timer, Observable } from 'rxjs';
import { map, combineLatestAll, take } from 'rxjs';

const output = document.createElement('div');
document.body.appendChild(output);

// 3Zwei simulierteAPIAufruf erstellen (Higher-order Observable)
const apiCalls$: Observable<Observable<string>> = of(
  // API 1: Benutzerinformationen (1Abgeschlossen in Sekunden,3einmal aktualisiert)
  timer(0, 1000).pipe(
    take(3),
    map(n => `Benutzer: User${n}`)
  ),
  // API 2: Anzahl der Benachrichtigungen (0.5Abgeschlossen in Sekunden,4einmal aktualisiert)
  timer(0, 500).pipe(
    take(4),
    map(n => `Benachrichtigungen: ${n}Anzahl der Benachrichtigungen`)
  ),
  // API 3: Status2Abgeschlossen in Sekunden,2einmal aktualisiert)
  timer(0, 2000).pipe(
    take(2),
    map(n => n === 0 ? 'Status: Offline' : 'Status: Online')
  )
);

// AlleAPIKombinierter letzter Wert der Anrufe
apiCalls$
  .pipe(combineLatestAll())
  .subscribe(values => {
    output.innerHTML = '<strong>Letzter Status:</strong><br>';
    values.forEach((value, index) => {
      const item = document.createElement('div');
      item.textContent = `${index + 1}. ${value}`;
      output.appendChild(item);
    });
  });
  • Drei API-Aufrufe werden parallel ausgeführt.
  • Nachdem alle mindestens einmal ausgelöst wurden, werden die kombinierten Ergebnisse angezeigt
  • Jedes Mal, wenn eine API aktualisiert wird, wird die neueste Kombination angezeigt

🔄 Verwandte Creation Function

Die Funktion combineLatestAll wird hauptsächlich für die Verflachung von Observable höherer Ordnung verwendet, Verwenden Sie die Creation Function combineLatest für normale Kombinationen aus Observables höherer Ordnung.

ts
import { combineLatest, interval } from 'rxjs';

// Creation FunctionAusgabe (allgemeinere Verwendung)
const combined$ = combineLatest([
  interval(1000),
  interval(500),
  interval(2000)
]);

combined$.subscribe(console.log);

Siehe Kapitel 3 Creation Function - combineLatest.

🔄 Verwandte Operatoren.

Bediener.Beschreibung.
mergeAllAlle internen Observable parallel abonnieren.
concatAllInterne Observable nacheinander abonnieren.
switchAllZu einem neuen internen Observable wechseln.
zipAllPaarung der Werte jedes internen Observable in der entsprechenden Reihenfolge

⚠️ Anmerkungen.

Observable höherer Ordnung muss ausgefüllt werden.

combineLatestAll" wartet auf die Sammlung interner Observables, bis die Observable höherer Ordnung (äußere Observable) vollständig ist.

❌ Observable höherer Ordnung wird nicht abgeschlossen, also wird nichts ausgegeben

ts
interval(1000).pipe(
  map(() => of(1, 2, 3)),
  combineLatestAll()
).subscribe(console.log); // Es wird nichts ausgegeben

✅ Take to complete

ts
interval(1000).pipe(
  take(3), // 3Abgeschlossen in einer Sitzung
  map(() => of(1, 2, 3)),
  combineLatestAll()
).subscribe(console.log);

Alle internen Observable müssen mindestens einmal ausgelöst werden

Es wird kein Wert ausgegeben, bevor nicht alle internen Observable mindestens einmal ausgelöst haben.

ts
// 1Wenn einer der internenObservableEs wird nichts ausgegeben, wenn es
of(
  of(1, 2, 3),
  NEVER // Niemals feuert für immer.
).pipe(
  combineLatestAll()
).subscribe(console.log); // Es wird nichts ausgegeben

Speicherverbrauch.

Beachten Sie den Speicherverbrauch, wenn es viele interne Observable gibt, da die letzten Werte aller internen Observable im Speicher gehalten werden.

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