Skip to content

combineLatestAll - combineer de laatste waarden van de interne Observable

De combineLatestAll operator neemt een Higher-order Observable (Observable of Observables), Zodra alle interne Observable ten minste één keer zijn afgevuurd, worden de laatste waarden van elk gecombineerd en uitgevoerd als een array.

🔰 Basissyntaxis en gebruik

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

// 3Twee interneObservablemetHigher-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 interneObservablehebben ten minste1een keer afgevuurd, combineer de laatste waarden
higherOrder$
  .pipe(combineLatestAll())
  .subscribe(values => console.log(values));

// Uitgang:
// [1, 3, 0] ← Als alles minstens één keer is afgevuurd1Als alles minstens één keer is afgevuurd (na2seconden later)
// [2, 3, 0] ← 1Wanneer de tweedeObservablewordt afgevuurd (na 2 seconden)2vuurt (na3seconden later)
// [2, 3, 1] ← 3Wanneer de tweedeObservablewordt afgevuurd (na 2 seconden)1vuurt (na4seconden later)
  • Verzamel interne Observables wanneer Observable van hogere orde compleet is.
  • Begin met combineren als alle interne Observable ten minste één keer zijn geactiveerd**.
  • Telkens wanneer een Interne Observable een waarde afgeeft, combineer alle laatste waarden en uitvoer.

🌐 Officiële RxJS documentatie - combineLatestAll

💡 Typisch gebruikspatroon.

  • Combineer de laatste resultaten van meerdere API-aanroepen**
  • Synchroniseer de laatste waarden van meerdere formulierinvoeren
  • Integreer meerdere real-time gegevensbronnen

Praktische codevoorbeelden

Voorbeeld van het combineren van de laatste resultaten van meerdere API-aanroepen

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

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

// 3Twee gesimuleerdeAPICreëer aanroep (Higher-order Observable)
const apiCalls$: Observable<Observable<string>> = of(
  // API 1: Gebruikersinformatie (1Voltooid in seconden,3eenmaal bijgewerkt)
  timer(0, 1000).pipe(
    take(3),
    map(n => `Gebruiker: User${n}`)
  ),
  // API 2: Aantal meldingen (0.5Voltooid in seconden,4eenmaal bijgewerkt)
  timer(0, 500).pipe(
    take(4),
    map(n => `Meldingen: ${n}Aantal meldingen`)
  ),
  // API 3: Status2Voltooid in seconden,2eenmaal bijgewerkt)
  timer(0, 2000).pipe(
    take(2),
    map(n => n === 0 ? 'Status: Offline' : 'Status: Online')
  )
);

// AlleAPIGecombineerde laatste waarde van oproepen
apiCalls$
  .pipe(combineLatestAll())
  .subscribe(values => {
    output.innerHTML = '<strong>Laatste status:</strong><br>';
    values.forEach((value, index) => {
      const item = document.createElement('div');
      item.textContent = `${index + 1}. ${value}`;
      output.appendChild(item);
    });
  });
  • Drie API-oproepen worden parallel uitgevoerd.
  • Als ze allemaal ten minste één keer zijn uitgevoerd, worden de gecombineerde resultaten weergegeven.
  • Telkens wanneer een API wordt bijgewerkt, wordt de laatste combinatie weergegeven

🔄 Gerelateerde Creation Function

combineLatestAllwordt echter voornamelijk gebruikt voor het afvlakken van hogere-orde Observable, Gebruik de **Creation Function**combineLatest` voor normale combinaties van Observables.

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

// Creation FunctionUitgave (meer algemeen gebruik)
const combined$ = combineLatest([
  interval(1000),
  interval(500),
  interval(2000)
]);

combined$.subscribe(console.log);

Zie [Hoofdstuk 3 Creation Function - combineLatest] (/guide/creation-functions/combination/combineLatest).

🔄 Verwante operatoren.

Exploitant.Beschrijving.
mergeAllAbonneer alle interne Observable parallel.
concatAllAbonneer op interne Observable in volgorde.
switchAllSchakel naar een nieuwe interne Observable.
zipAllKoppel de waarden van elke interne Observable in de overeenkomstige volgorde

⚠️ Opmerkingen.

Observable van hogere orde moet worden ingevuld.

combineLatestAll` wacht op de verzameling van interne Observables tot de hogere-orde Observable (buitenste Observable) is voltooid.

❌ De hogere-orde Observable wordt niet voltooid, dus er wordt niets uitgevoerd.

ts
interval(1000).pipe(
  map(() => of(1, 2, 3)),
  combineLatestAll()
).subscribe(console.log); // Er wordt niets uitgevoerd

✅ Take to complete

ts
interval(1000).pipe(
  take(3), // 3Voltooid in één sessie
  map(() => of(1, 2, 3)),
  combineLatestAll()
).subscribe(console.log);

Alle interne Observable moeten ten minste één keer afgaan

Er wordt geen waarde uitgevoerd totdat alle interne Observable ten minste eenmaal zijn geactiveerd.

ts
// 1Als een van de interneObservableEr wordt niets uitgevoerd als er
of(
  of(1, 2, 3),
  NEVER // Nooit voor altijd afgaat.
).pipe(
  combineLatestAll()
).subscribe(console.log); // Er wordt niets uitgevoerd

Geheugengebruik.

Let op het geheugengebruik als er veel interne Observable zijn, aangezien de laatste waarden van alle interne Observable in het geheugen worden bewaard.

Uitgebracht onder de CC-BY-4.0 licentie.