Skip to content

withLatestFrom - Combiner avec la dernière valeur lors de l'émission principale

L'opérateur withLatestFrom émet chaque fois que le flux principal émet une valeur, en la combinant avec la dernière valeur d'un autre flux.

Syntaxe de base et utilisation

ts
import { interval, fromEvent } from 'rxjs';
import { withLatestFrom, map, take } from 'rxjs';

const clicks$ = fromEvent(document, 'click');
const timer$ = interval(1000);

clicks$
  .pipe(
    withLatestFrom(timer$),
    map(([click, timerValue]) => `Compteur au moment du clic: ${timerValue}`)
  )
  .subscribe(console.log);

// Sortie:
// Compteur au moment du clic: 1
// Compteur au moment du clic: 2
// Compteur au moment du clic: 2
// Compteur au moment du clic: 5
  • L'Observable principal (ici les clics) déclenche l'émission,
  • La dernière valeur de l'Observable secondaire (ici le compteur) est combinée à chaque fois.

Documentation officielle RxJS - withLatestFrom

Patterns d'utilisation typiques

  • Obtenir le dernier état lors d'une action utilisateur
  • Référencer les données en cache lors d'une requête
  • Combinaison de données déclenchée par événement

Exemple de code pratique (avec UI)

Un exemple qui récupère la dernière valeur d'un champ de saisie toutes les 2 secondes.

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

const title = document.createElement('h3');
title.innerHTML = 'withLatestFrom - Récupération de la dernière saisie toutes les 2 secondes:';
document.body.appendChild(title);

// Création du champ de saisie
const nameInput = document.createElement('input');
nameInput.placeholder = 'Entrez un nom';
document.body.appendChild(nameInput);

// Création de la zone de sortie
const output = document.createElement('div');
document.body.appendChild(output);

// Observable de saisie
const name$ = fromEvent(nameInput, 'input').pipe(
  map((e) => (e.target as HTMLInputElement).value),
  startWith('') // Émet une chaîne vide au départ
);

// Timer (déclenche toutes les 2 secondes)
const timer$ = interval(2000);

// Récupère la dernière valeur de saisie à chaque déclenchement du timer
timer$.pipe(withLatestFrom(name$)).subscribe(([_, name]) => {
  const item = document.createElement('div');
  item.textContent = `Récupération toutes les 2 sec: Nom: ${name}`;
  output.prepend(item);
});
  • Pendant que l'utilisateur continue à saisir,
  • La dernière saisie est récupérée et affichée toutes les 2 secondes.

Publié sous licence CC-BY-4.0.