Skip to content

Qu'est-ce que RxJS ?

Aperçu

RxJS (Reactive Extensions for JavaScript) est une bibliothèque de "programmation réactive" en JavaScript.

Qu'est-ce que la programmation réactive ?

La programmation réactive est une méthode de création de programmes qui sont automatiquement mis à jour en réponse à des changements de données. Il s'agit d'un type de programmation événementielle, qui met l'accent sur la gestion des flux de données asynchrones. Elle se concentre sur le flux de données et construit des programmes qui réagissent à ce flux.

En d'autres termes, RxJS est une bibliothèque permettant de gérer les événements et les flux de données asynchrones dans un style fonctionnel, fournissant des outils puissants pour gérer les flux de données asynchrones à l'aide du modèle Observable.

Observable est l'élément de base de RxJS pour représenter les événements et les flux de données asynchrones. Il s'agit d'une source de valeurs qui "circulent" et peuvent être reçues en s'y abonnant. Un Observable est un "flux de données" qui publie des valeurs au fil du temps, et vous pouvez recevoir ces valeurs en vous y abonnant.

TIP

Si vous vous demandez : "Qu'est-ce qu'un flux de données ?" veuillez vous référer à Qu'est-ce qu'un flux ?.

Exemple d'utilisation simple

ts
import { fromEvent } from 'rxjs';

fromEvent(document, 'click').subscribe(event => {
  console.log('Cliqué:', event);
});

Composants de base de RxJS

Pour maîtriser RxJS, il est important de comprendre les composants de base suivants.

ComposantVue d'ensemble
ObservableLa source du flux, qui représente les données qui se produisent de manière asynchrone ou dans le temps.
Observer[1]L'entité qui s'abonne à l'Observable et reçoit des données de celui-ci.
SubscriptionGère l'abonnement et le désabonnement de l'Observable.
Creation FunctionsEnsemble de fonctions permettant de créer et de combiner des Observables.
OperatorEnsemble de fonctions permettant de convertir et de contrôler un Observable.
Subject[2]C'est un relais qui a les propriétés d'un Observable et d'un Observer.
Scheduler[3]Mécanisme permettant de contrôler le moment de l'exécution de l'Observable.

Elles ont leurs propres fonctions indépendantes, mais travaillent ensemble. Par exemple, les Creation Functions créent et combinent les Observables, les Operators les transforment et les contrôlent, les Observers s'y abonnent et les Schedulers contrôlent le calendrier d'exécution, constituant ainsi le traitement du flux dans son ensemble.

Composants RxJS et flux de données

※ L'utilisation détaillée et les exemples de chaque composant sont expliqués séparément dans leurs propres chapitres.

Diagramme de classe des composants

Avantages de RxJS

AvantageContenu
Code déclaratif[4]Décrivez "ce que vous voulez faire" avec map, filter, etc. et évitez les descriptions procédurales telles que les boucles for
Simplifier le traitement asynchroneÉviter les Promise imbriquées et les callbacks, et écrire dans un flux intuitif
Gestion des erreursGestion uniforme des erreurs dans les flux avec .pipe(catchError(...)), etc.
AnnulableLe flux peut être suspendu par Subscription.unsubscribe()
Divers opérateursDe nombreux opérateurs tels que debounceTime, mergeMap, combineLatest, etc. peuvent être utilisés pour la conversion et la composition

Cas d'utilisation

RxJS peut être utilisé dans toutes les situations où vous avez affaire à des "données qui changent au fil du temps". Voici quelques-uns des principaux cas d'utilisation.

Communication en temps réel et Streaming

RxJS est particulièrement puissant pour les communications en temps réel telles que WebSockets et Server-Sent Events (SSE).

Cas d'utilisationDescriptionPrincipaux opérateurs
Communication WebSocketChat, notifications, mises à jour des cours boursiers, etc.webSocket, filter, map
Server-Sent EventsNotifications push depuis les serveursfromEvent, retry
Surveillance des capteurs IoTTraitement continu des données de capteursdebounceTime, distinctUntilChanged

Exemple simple

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('Nouveau message:', msg.text));

Gestion d'état et contrôle de formulaires

Gestion réactive des entrées utilisateur et des changements d'état.

Relation avec les frameworks

Les frameworks front-end modernes (Angular Signals, React hooks, Vue Composition API, Svelte Runes, etc.) fournissent chacun leurs propres systèmes réactifs. RxJS est une bibliothèque indépendante du framework qui peut être utilisée conjointement ou séparément de ceux-ci. L'intégration de RxJS avec les mécanismes spécifiques aux frameworks sera discutée en détail au chapitre 15, "Intégration avec les frameworks" (en préparation).

Cas d'utilisationDescriptionPrincipaux opérateurs
Contrôle des formulaires de saisieAutocomplétion de recherche, validation en temps réeldebounceTime, distinctUntilChanged, switchMap
Liaison de plusieurs éléments de formulaireMise à jour des éléments de saisie dépendantscombineLatest, withLatestFrom
Communication inter-composantsBus d'événements et gestion d'état personnaliséeSubject, share
Traitement des événements UIClic, scroll, drag & dropfromEvent, takeUntil

Exemple simple

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));

Support hors ligne & PWA

Peut être utilisé pour le support hors ligne et la gestion de l'état du réseau dans les Progressive Web App (PWA).

Cas d'utilisationDescriptionPrincipaux opérateurs
Surveillance de l'état du réseauDétection en ligne/hors lignefromEvent, merge
Réessai hors ligneResynchronisation automatique lors de la restauration de la connexionretry, retryWhen
Contrôle du cacheIntégration Service WorkerswitchMap, catchError

Exemple simple

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 ? 'En ligne' : 'Hors ligne');
});

API IA/Streaming

C'est également idéal pour gérer les réponses d'API streaming comme OpenAI.

Cas d'utilisationDescriptionPrincipaux opérateurs
Sortie séquentielle de tokensAffichage en temps réel des réponses IAconcatMap, scan
Traitement streamingTraitement Server-Sent EventsfromEvent, map
Intégration back-endUtilisation avec NestJS (standard RxJS)Divers opérateurs

Communication HTTP et gestion des erreurs

La communication HTTP asynchrone peut être gérée élégamment.

Cas d'utilisationDescriptionPrincipaux opérateurs
Requêtes APICommunication avec les APIs RESTfulswitchMap, mergeMap
Gestion des erreursRéessais et fallbackscatchError, retry
Contrôle du timeoutLimites de temps de réponsetimeout
AnnulationAbandon des requêtes inutilestakeUntil, unsubscribe()

Gestion d'état & Architecture

Peut également être utilisé pour concevoir l'architecture globale de l'application.

Cas d'utilisationDescriptionPrincipaux opérateurs
Bibliothèques de gestion d'étatNgRx, Redux-Observable, etc.scan, share
Gestion du flux d'événementsUtilisation dans DDD (Domain Driven Design)Subject, shareReplay
Séparation de la couche de donnéesArchitecture propreDivers opérateurs

TIP

Voir aussi la différence entre Promise et RxJS pour plus d'informations sur l'utilisation de Promise et RxJS.

Résumé

RxJS offre une approche puissante de la programmation asynchrone et événementielle, et sa philosophie de flux de données centrée sur Observable est particulièrement utile lorsqu'il s'agit de traitements asynchrones complexes.


  1. La classe Subscriber est utilisée comme implémentation. Pour plus de détails, voir Différence entre Observer et Subscriber. ↩︎

  2. Un Subject est une entité spéciale qui peut agir à la fois comme un Observable qui émet des valeurs et comme un Observer qui reçoit des valeurs. ↩︎

  3. Le Scheduler est utilisé pour contrôler le temps d'exécution et le contexte du traitement asynchrone et est également utile pour le débogage et la gestion des performances. ↩︎

    • Code déclaratif : code direct qui dit "quel type de résultat voulez-vous ?"
    • Code procédural : code qui décrit "quel type de calcul doit être effectué pour obtenir le résultat souhaité"
    ↩︎

Publié sous licence CC-BY-4.0.