Skip to content

Wat is RxJS?

Overzicht

RxJS (Reactive Extensions for JavaScript) is een bibliotheek voor het uitvoeren van "reactief programmeren" in JavaScript.

Wat is reactief programmeren?

Reactief programmeren is een manier om programma's te maken die automatisch worden bijgewerkt in reactie op veranderingen in gegevens. Het is een vorm van event-driven programmeren, met name gericht op het omgaan met asynchrone datastreams. Het bouwt programma's door te denken vanuit de gegevensstroom (stream) en te reageren op die stroom.

Met andere woorden, RxJS is een bibliotheek voor het omgaan met gebeurtenissen en asynchrone gegevensstromen (streams) in een functionele stijl. Het maakt gebruik van het Observable-patroon om krachtige tools te bieden voor het werken met asynchrone datastreams.

Observable is een kerncomponent van RxJS die de stroom van gebeurtenissen of asynchrone gegevens (stream) vertegenwoordigt. Het is de bron waar waarden "uit stromen" en je kunt waarden ontvangen door te subscriben. Een Observable is een "gegevensstroom (stream)" die waarden uitzendt in de loop van de tijd. Door te subscriben (subscribe) kun je die waarden ontvangen.

TIP

Als je je afvraagt "Wat is eigenlijk een stream?", kijk dan ook eens naar Wat is een Stream?

Eenvoudig gebruiksvoorbeeld

ts
import { fromEvent } from 'rxjs';

fromEvent(document, 'click').subscribe(event => {
  console.log('Er is geklikt:', event);
});

Basiselementen van RxJS

Om RxJS effectief te gebruiken, is het belangrijk om de volgende kernelementen te begrijpen.

ElementOverzicht
ObservableDe bron van een stream die asynchrone of tijdgebonden gegevens vertegenwoordigt.
Observer[1]De entiteit die zich abonneert op en gegevens ontvangt van een Observable.
SubscriptionBeheert het subscriben op en afmelden van een Observable.
Creation FunctionsEen verzameling functies voor het maken en combineren van Observables.
OperatorEen verzameling functies voor het transformeren en beheersen van Observables.
Subject[2]Een relay die zowel de eigenschappen van Observable als Observer heeft.
Scheduler[3]Een mechanisme om de uitvoeringstiming van Observables te beheersen.

Deze elementen hebben elk hun eigen functionaliteit, maar werken samen. Bijvoorbeeld: Creation Functions maken en combineren Observables, Operators transformeren en beheersen ze, Observer abonneert zich erop, en Scheduler regelt de uitvoeringstiming - samen vormen ze de streamverwerking.

RxJS-componenten en dataflow

※ Het gedetailleerde gebruik en voorbeelden van elk element worden afzonderlijk uitgelegd in hun respectieve hoofdstukken.

Component klassediagram

Voordelen van RxJS

VoordeelInhoud
Declaratieve code[4]Met map, filter etc. beschrijf je "wat je wilt doen" en vermijd je procedurele beschrijvingen zoals for-loops
Vereenvoudiging van asynchrone verwerkingVermijd geneste Promise en callbacks, schrijf met een intuïtieve flow
FoutafhandelingUniform afhandelen van fouten in streams met .pipe(catchError(...)) etc.
AnnuleerbaarStream kan worden onderbroken met Subscription.unsubscribe()
Diverse operatorsVele operators zoals debounceTime, mergeMap, combineLatest voor transformatie en compositie

Use cases

RxJS blinkt uit in elke situatie waar je "gegevens die veranderen in de loop van de tijd" moet verwerken. Hieronder introduceren we de belangrijkste toepassingsgebieden.

Realtime communicatie & streaming

Bij realtime communicatie zoals WebSocket en Server-Sent Events (SSE) is RxJS bijzonder krachtig.

ToepassingBeschrijvingBelangrijke operators
WebSocket-communicatieChat, notificaties, koersupdates etc.webSocket, filter, map
Server-Sent EventsPush-notificaties van serverfromEvent, retry
IoT sensor monitoringVerwerking van continue sensorgegevensdebounceTime, distinctUntilChanged

Eenvoudig voorbeeld

ts
import { webSocket } from 'rxjs/webSocket';
import { filter } from 'rxjs';

const socket$ = webSocket('wss://example.com/chat');

socket$.pipe(
  filter(msg => msg.type === 'message')
).subscribe(msg => console.log('Nieuw bericht:', msg.text));

UI/statusbeheer & formuliercontrole

Je kunt gebruikersinvoer en statusveranderingen reactief afhandelen.

Relatie met frameworks

Moderne frontend frameworks (Angular Signals, React hooks, Vue Composition API, Svelte Runes, etc.) bieden elk hun eigen reactieve systeem. RxJS is een framework-onafhankelijke bibliotheek en kan naast deze worden gebruikt of ermee worden gecombineerd. De integratie van RxJS met framework-specifieke mechanismen wordt uitgebreid besproken in Hoofdstuk 15 "Integratie met Frameworks" (in voorbereiding).

ToepassingBeschrijvingBelangrijke operators
InvoerformuliercontroleZoeksuggesties, realtime validatiedebounceTime, distinctUntilChanged, switchMap
Koppeling van meerdere formulierveldenBijwerken van afhankelijke invoerveldencombineLatest, withLatestFrom
Communicatie tussen componentenEvent bus of aangepast statusbeheerSubject, share
UI-eventafhandelingKlikken, scrollen, drag & dropfromEvent, takeUntil

Eenvoudig voorbeeld

ts
import { fromEvent, combineLatest } from 'rxjs';
import { debounceTime, map, switchMap } from 'rxjs';

const searchInput = document.querySelector('#search') as HTMLInputElement;
const sortSelect = document.querySelector('#sort') as HTMLInputElement;

const search$ = fromEvent(searchInput, 'input').pipe(
  map(e => (e.target as HTMLInputElement).value)
);

const sort$ = fromEvent(sortSelect, 'change').pipe(
  map(e => (e.target as HTMLSelectElement).value)
);

combineLatest([search$, sort$]).pipe(
  debounceTime(300),
  switchMap(([query, order]) =>
    fetch(`/api/search?q=${query}&sort=${order}`).then(r => r.json())
  )
).subscribe(results => console.log(results));

Offline-ondersteuning & PWA

Kan worden gebruikt voor offline-ondersteuning en netwerkstatusbeheer in Progressive Web Apps (PWA).

ToepassingBeschrijvingBelangrijke operators
NetwerkstatusmonitoringOnline/offline detectiefromEvent, merge
Opnieuw proberen bij offlineAutomatische hersynchronisatie bij verbindingsherstelretry, retryWhen
Cache-controleIntegratie met Service WorkerswitchMap, catchError

Eenvoudig voorbeeld

ts
import { fromEvent, merge } from 'rxjs';
import { map, startWith } from 'rxjs';

const online$ = fromEvent(window, 'online').pipe(map(() => true));
const offline$ = fromEvent(window, 'offline').pipe(map(() => false));

merge(online$, offline$).pipe(
  startWith(navigator.onLine)
).subscribe(isOnline => {
  console.log(isOnline ? 'Online' : 'Offline');
});

AI/Streaming-API's

Ook ideaal voor het werken met streaming API-responses zoals OpenAI.

ToepassingBeschrijvingBelangrijke operators
Token-voor-token uitvoerRealtime weergave van AI-responsesconcatMap, scan
StreamingverwerkingVerwerking van Server-Sent EventsfromEvent, map
Backend-integratieGebruik in NestJS (standaard met RxJS)Diverse operators

HTTP-communicatie en foutafhandeling

Je kunt asynchrone HTTP-communicatie elegant afhandelen.

ToepassingBeschrijvingBelangrijke operators
API-verzoekenCommunicatie met RESTful API'sswitchMap, mergeMap
FoutafhandelingOpnieuw proberen of fallbackcatchError, retry
Timeout-controleBeperking van responstijdtimeout
AnnulerenOnderbreken van onnodige verzoekentakeUntil, unsubscribe()

Statusbeheer & architectuur

Kan ook worden gebruikt voor het ontwerpen van de architectuur van de gehele applicatie.

ToepassingBeschrijvingBelangrijke operators
StatusbeheerbibliothekenNgRx, Redux-Observable, etc.scan, share
Event flow beheerGebruik in DDD (Domain-Driven Design)Subject, shareReplay
Datalaag scheidingClean ArchitectureDiverse operators

TIP

Zie ook Verschil tussen Promise en RxJS voor het kiezen tussen Promise en RxJS.

Samenvatting

RxJS biedt een krachtige benadering van asynchrone en event-based programmering. Het concept van datastreams gecentreerd rond Observable is bijzonder nuttig bij het omgaan met complexe asynchrone verwerking.


  1. Als implementatie wordt de Subscriber-klasse gebruikt. Zie Verschil tussen Observer en Subscriber voor details. ↩︎

  2. Subject is een speciale entiteit die zich zowel gedraagt als een Observable die waarden uitzendt, als een Observer die waarden ontvangt. ↩︎

  3. Scheduler wordt gebruikt om de timing en context van asynchrone verwerking te beheersen en is ook nuttig voor debugging en prestatiebeheer. ↩︎

    • Declaratieve code: Code die rechtstreeks schrijft "welk resultaat je wilt"
    • Procedurele code: Code die schrijft "welke berekeningen moeten worden uitgevoerd om het gewenste resultaat te verkrijgen"
    ↩︎

Uitgebracht onder de CC-BY-4.0 licentie.