Service en ligne 100% Gratuit Utilitaires Web AngularForAll

- Testeur d'opérateurs RxJS en ligne : marble diagram

Rxjs Operateurs-Rxjs Marble-Diagram Observable Switchmap Debouncetime Mergemap Programmation-Reactive Angular-Rxjs Map-Filter Testeur-Rxjs Flux-Asynchrone Rxjs-Pipe Reactive-Extensions

Testez et visualisez les opérateurs RxJS map, filter, switchMap et debounceTime avec un marble diagram interactif et obtenez le code prêt à copier.

🔀

Testeur d'opérateurs RxJS — Marble Diagram

🔧 Configuration

Une émission par ligne : valeur@millisecondes.
Laisser vide pour un flux infini.
Presets :
💡 Astuce : tout est recalculé en direct à chaque modification.

Source (input$)
Résultat après l'opérateur
Code RxJS
Émissions de sortie :

RxJS : comprendre les opérateurs avec un marble diagram

RxJS (Reactive Extensions for JavaScript) est la bibliothèque de programmation réactive au cœur d'Angular. Tout y est flux : un clic, une requête HTTP, la valeur d'un champ de formulaire. Les opérateurs sont les fonctions qui transforment, filtrent et combinent ces flux d'Observable. Le problème ? Beaucoup d'opérateurs ont un comportement temporel difficile à saisir avec une simple lecture de la doc. C'est exactement ce que ce testeur résout : un marble diagram interactif qui montre, en temps réel, comment chaque opérateur agit sur une séquence de valeurs.

Un marble diagram représente un flux comme une ligne de temps horizontale. Chaque « bille » (marble) est une valeur émise, positionnée selon son instant d'émission ; une barre verticale marque la complétion (complete). En modifiant le flux source au format valeur@temps, vous observez immédiatement le flux résultant. C'est la même logique que le TestScheduler de RxJS, mais visuel et sans installation.

Opérateurs de transformation : map, scan, mergeMap, switchMap

Les opérateurs de transformation modifient les valeurs ou les projettent vers de nouveaux flux. map applique une fonction à chaque valeur, scan accumule un état (comme reduce mais émet à chaque étape), tandis que mergeMap et switchMap projettent chaque valeur vers un flux interne.

import { fromEvent, switchMap, map, debounceTime, distinctUntilChanged } from 'rxjs';
import { ajax } from 'rxjs/ajax';

// Autocomplétion : annule la requête précédente à chaque frappe
const search$ = fromEvent<Event>(input, 'input').pipe(
  map(e => (e.target as HTMLInputElement).value),
  debounceTime(300),              // attend 300ms de silence
  distinctUntilChanged(),         // ignore si la valeur n'a pas changé
  switchMap(q => ajax.getJSON(`/api/search?q=${q}`))  // annule l'ancienne requête
);
switchMap vs mergeMap : pour de l'autocomplétion, switchMap est le bon choix car il annule la requête précédente. Pour des actions indépendantes qui doivent toutes aboutir (ex: enregistrer plusieurs éléments), préférez mergeMap. Sélectionnez les deux dans l'outil ci-dessus pour comparer leurs marble diagrams.

Opérateurs de filtrage : filter, take, debounceTime, throttleTime

Le filtrage contrôle quelles valeurs passent et quand. filter applique un prédicat, take(n) ne garde que les N premières valeurs puis complète, debounceTime et throttleTime gèrent la cadence d'émission — essentiels pour limiter les appels lors d'événements rapides (scroll, resize, frappe clavier).

Opérateur Comportement Cas d'usage typique
debounceTime(d) Émet après d ms de silence Champ de recherche (autocomplétion)
throttleTime(d) Émet la 1re valeur, ignore pendant d ms Scroll, clics répétés (anti-spam)
distinctUntilChanged() Supprime les doublons consécutifs Éviter les recalculs identiques
take(n) N premières valeurs puis complète Lecture unique, désabonnement auto

Opérateurs utilitaires : tap, delay, startWith, endWith

tap exécute un effet de bord (log, debug) sans modifier le flux — idéal pour comprendre un pipe complexe. delay décale toutes les émissions, startWith injecte une valeur initiale (parfait pour un état de chargement), et endWith ajoute une valeur finale avant la complétion.

import { interval, startWith, tap, take, map } from 'rxjs';

const compteur$ = interval(1000).pipe(
  startWith(-1),                       // affiche un état initial immédiat
  map(n => n + 1),
  take(5),                             // 0,1,2,3,4 puis complète
  tap(n => console.log('Tick', n))     // debug sans altérer le flux
);

RxJS dans Angular : les patterns à connaître

Dans un projet Angular, RxJS est omniprésent : HttpClient renvoie des Observables, les FormControl exposent valueChanges, et le Router publie ses événements en flux. Combiné au pipe async dans les templates, RxJS évite les fuites mémoire (désabonnement automatique) et le code impératif.

// composant Angular standalone
export class SearchComponent {
  private http = inject(HttpClient);
  private search = inject(FormControl);

  results$ = this.search.valueChanges.pipe(
    debounceTime(300),
    distinctUntilChanged(),
    switchMap(q => this.http.get<Result[]>(`/api?q=${q}`)),
    startWith([])                       // liste vide au départ
  );
  // Template : <li *ngFor="let r of results$ | async">...
}
Bonne pratique : privilégiez le pipe async dans le template plutôt qu'un subscribe() manuel. Angular se charge alors du désabonnement quand le composant est détruit, supprimant une source classique de fuites mémoire.

Erreurs fréquentes avec les opérateurs RxJS

Pièges courants à éviter :
  • Utiliser mergeMap pour de l'autocomplétion → requêtes obsolètes affichées. Utilisez switchMap.
  • Oublier debounceTime sur un champ de saisie → une requête par caractère tapé.
  • S'abonner manuellement sans se désabonner → fuite mémoire. Préférez async ou takeUntilDestroyed().
  • Confondre concatMap (séquentiel), mergeMap (parallèle) et exhaustMap (ignore tant qu'occupé).
  • Placer les opérateurs dans le mauvais ordre dans le pipe() — l'ordre change tout.

FAQ — Opérateurs RxJS

debounceTime(d) attend un silence de d ms avant d'émettre la dernière valeur — idéal pour un champ de recherche. throttleTime(d) émet immédiatement la première valeur puis ignore les suivantes pendant d ms — idéal pour limiter des événements de scroll ou de clic. Sélectionnez chacun dans l'outil pour comparer leur marble diagram.
switchMap annule le flux interne précédent (autocomplétion). mergeMap exécute tous les flux en parallèle (uploads indépendants). concatMap les enchaîne séquentiellement (ordre garanti). exhaustMap ignore les nouvelles valeurs tant que le flux courant n'est pas terminé (anti double-clic sur un bouton de connexion).
Un marble diagram est une représentation visuelle d'un Observable sur une ligne de temps : chaque bille est une valeur émise, sa position indique l'instant d'émission, et une barre verticale marque la complétion. C'est le langage standard de la documentation RxJS et des tests avec TestScheduler.
Oui. Les Signals gèrent l'état synchrone et réactif d'un composant, mais RxJS reste incontournable pour les flux asynchrones complexes (requêtes HTTP, événements, websockets, gestion du temps). Les fonctions toSignal() et toObservable() font le pont entre les deux mondes.
Utilisez le pipe async dans le template (désabonnement automatique), l'opérateur takeUntilDestroyed() (Angular 16+) ou des opérateurs qui complètent comme take, first, takeUntil. Évitez les subscribe() manuels sans gestion du cycle de vie.

Conclusion

Maîtriser RxJS, c'est d'abord comprendre visuellement le comportement de ses opérateurs dans le temps. Ce testeur interactif vous permet d'expérimenter map, filter, debounceTime, switchMap et bien d'autres sans configurer un projet : modifiez le flux source, observez le résultat, copiez le code. C'est l'outil idéal pour préparer un entretien Angular, déboguer un pipe récalcitrant ou simplement consolider vos bases en programmation réactive.

Pour aller plus loin, consultez la documentation officielle des opérateurs RxJS et explorez nos autres outils Angular pour générer guards, services et composants en quelques clics.

Partager