Skip to content

startWith - Fournir des valeurs initiales ​

L'opérateur startWith émet une valeur initiale spécifiée avant que l'Observable source n'émette des valeurs. Il est utilisé pour la gestion de l'état, l'affichage initial, les valeurs de remplacement, etc.

🔰 Syntaxe et comportement de base ​

ts
import { of } from 'rxjs';
import { startWith } from 'rxjs';

of('B', 'C').pipe(
  startWith('A')
).subscribe(console.log);
// Sortie :
// A
// B
// C

De cette façon, startWith ajoute 'A' en premier, suivi par les valeurs de l'Observable source.

🌐 Documentation officielle RxJS - startWith

💡 Cas d'utilisation typiques ​

Il est utile lorsque vous souhaitez définir des valeurs initiales pour l'état ou les compteurs. Voici un exemple de compteur démarrant à partir de la valeur initiale 100.

ts
import { interval } from 'rxjs';
import { startWith, scan, take } from 'rxjs';

interval(1000)
  .pipe(
    startWith(-1), // Insère d'abord -1
    scan((acc, curr) => acc + 1, 100), // Incrémente à partir de la valeur initiale 100
    take(10) // Produit 10 fois au total
  )
  .subscribe(console.log);
// Sortie :
// 101
// 102
// 103
// 104
// 105
// 106
// 107
// 108
// 109
// 110

🧪 Exemple de code pratique (avec interface utilisateur) ​

ts
import { interval } from 'rxjs';
import { startWith, scan, take } from 'rxjs';

// Zone d'affichage de la sortie
const startWithOutput = document.createElement('div');
startWithOutput.innerHTML = '<h3>Exemple de startWith :</h3>';
document.body.appendChild(startWithOutput);

// Zone d'affichage du compteur
const counterDisplay = document.createElement('div');
counterDisplay.style.fontSize = '24px';
counterDisplay.style.fontWeight = 'bold';
counterDisplay.style.textAlign = 'center';
counterDisplay.style.padding = '20px';
counterDisplay.style.border = '1px solid #ddd';
counterDisplay.style.borderRadius = '5px';
counterDisplay.style.margin = '10px 0';
startWithOutput.appendChild(counterDisplay);

// Zone d'affichage de la liste de valeurs
const valuesList = document.createElement('div');
valuesList.style.marginTop = '10px';
startWithOutput.appendChild(valuesList);

// Flux de comptage (toutes les 1 seconde)
interval(1000)
  .pipe(
    // Démarrage à partir de 100
    startWith(-1),
    // Ajoute 1 à la valeur précédente
    scan((acc, curr) => acc + 1, 100),
    // Fin après 10 fois
    take(10)
  )
  .subscribe((count) => {
    // Mise à jour de l'affichage du compteur
    counterDisplay.textContent = count.toString();

    // Ajout d'une valeur à la liste
    const valueItem = document.createElement('div');

    if (count === 100) {
      valueItem.textContent = `Valeur initiale : ${count} (ajoutée avec startWith)`;
      valueItem.style.color = 'blue';
    } else {
      valueItem.textContent = `Valeur suivante : ${count}`;
    }

    valuesList.appendChild(valueItem);
  });

✅ Résumé ​

  • startWith est utile lorsque vous voulez insérer une valeur fixe au début
  • Souvent utilisé pour l'initialisation de l'état, les placeholders de l'interface utilisateur, l'affichage initial du formulaire, etc.
  • Combiné avec scan ou combineLatest, il est aussi utilisé pour construire des fondations de gestion d'état

Publié sous licence CC-BY-4.0.