Skip to content

Funzioni di Creazione Condizionali ​

Le Funzioni di Creazione selezionano un Observable in base a una condizione o generano dinamicamente un Observable al momento della subscription.

Cosa Sono le Funzioni di Creazione Condizionali? ​

Le Funzioni di Creazione Condizionali hanno i seguenti ruoli:

  • Selezione Condizionale: Seleziona Observable diversi in base alle condizioni
  • Generazione Ritardata: Crea dinamicamente un Observable alla subscription

A differenza di altre Funzioni di Creazione, che creano e combinano Observable staticamente, queste possono cambiare comportamento in base a condizioni e stati a runtime.

NOTE

Sebbene iif e defer fossero precedentemente classificati come "operatori condizionali", sono Funzioni di Creazione (funzioni di creazione Observable), non Pipeable Operator.

Principali Funzioni di Creazione Condizionali ​

FunzioneDescrizioneCasi d'Uso
iifSeleziona uno di due Observable in base a una condizioneRamificazione elaborazione in base a stato login
deferRitarda generazione dell'Observable al momento della subscriptionCreazione dinamica Observable

Criteri di Utilizzo ​

iif - Due Rami in Base a Condizione ​

iif seleziona uno di due Observable in base al risultato di una funzione condizionale. La condizione viene valutata al momento della subscription.

Sintassi:

typescript
iif(
  () => condition,  // Funzione condizione (valutata alla subscription)
  trueObservable,   // Observable se true
  falseObservable   // Observable se false
)

Casi d'Uso:

  • Ramificazione elaborazione in base a stato login
  • Cambio elaborazione in base a esistenza cache
  • Cambio comportamento per variabili ambiente
typescript
import { iif, of } from 'rxjs';

const isAuthenticated = () => Math.random() > 0.5;

const data$ = iif(
  isAuthenticated,
  of('Dati autenticati'),
  of('Dati pubblici')
);

data$.subscribe(console.log);
// Output: 'Dati autenticati' o 'Dati pubblici' (dipende dalla condizione alla subscription)

defer - Generazione Ritardata alla Subscription ​

defer genera un Observable ogni volta che avviene una subscription. Questo permette all'Observable di cambiare comportamento in base al suo stato al momento della subscription.

Sintassi:

typescript
defer(() => {
  // Eseguito al momento della subscription
  return someObservable;
})

Casi d'Uso:

  • Generare Observable che riflette l'ultimo stato al momento della subscription
  • Generare un valore casuale diverso ogni volta
  • Eseguire elaborazione diversa per ogni subscription
typescript
import { defer, of } from 'rxjs';

// Ottieni l'ora corrente alla subscription
const timestamp$ = defer(() => of(new Date().toISOString()));

setTimeout(() => {
  timestamp$.subscribe(time => console.log('Prima:', time));
}, 1000);

setTimeout(() => {
  timestamp$.subscribe(time => console.log('Seconda:', time));
}, 2000);

// Output:
// Prima: 2024-10-21T01:00:00.000Z
// Seconda: 2024-10-21T01:00:01.000Z
// ※Orari diversi perché i momenti di subscription sono diversi

Differenza tra iif e defer ​

Caratteristicaiifdefer
SceltaSeleziona da due ObservableGenera qualsiasi Observable
Timing ValutazioneValuta condizione alla subscriptionEsegue funzione alla subscription
ScopoRamificazione condizionaleGenerazione dinamica

Uso in Pipeline ​

Le Funzioni di Creazione Condizionali possono essere usate in combinazione con altri operatori.

typescript
import { defer, of } from 'rxjs';
import { switchMap } from 'rxjs';

// Ottieni informazioni utente da ID utente
const userId$ = of(123);

userId$.pipe(
  switchMap(id =>
    defer(() => {
      // Controlla ultima cache alla subscription
      const cached = cache.get(id);
      return cached ? of(cached) : fetchUser(id);
    })
  )
).subscribe(console.log);

Conversione da Cold a Hot ​

Come mostrato nella tabella sopra, tutte le Funzioni di Creazione Condizionali generano Cold Observable. Le valutazioni condizionali e le funzioni di generazione vengono eseguite ogni volta che viene fatta una subscription.

Puoi convertire un Cold Observable in Hot Observable usando operatori multicast (share(), shareReplay(), ecc.).

Esempio Pratico: Condivisione Risultati Ramificazione Condizionale ​

typescript
import { iif, of, interval } from 'rxjs';
import { take, share } from 'rxjs';

const condition = () => Math.random() > 0.5;

// ❄️ Cold - Rivaluta condizione per ogni subscription
const coldIif$ = iif(
  condition,
  of('Condizione è vera'),
  interval(1000).pipe(take(3))
);

coldIif$.subscribe(val => console.log('Subscriber 1:', val));
coldIif$.subscribe(val => console.log('Subscriber 2:', val));
// → Ogni subscriber valuta indipendentemente la condizione (possibilità di risultati diversi)

// 🔥 Hot - Condividi risultati valutazione condizione tra subscriber
const hotIif$ = iif(
  condition,
  of('Condizione è vera'),
  interval(1000).pipe(take(3))
).pipe(share());

hotIif$.subscribe(val => console.log('Subscriber 1:', val));
hotIif$.subscribe(val => console.log('Subscriber 2:', val));
// → Condizione valutata solo una volta, risultati condivisi

TIP

Per maggiori informazioni, vedi Creazione Base - Conversione da Cold a Hot.

Prossimi Passi ​

Per apprendere il comportamento dettagliato e gli esempi pratici di ogni Funzione di Creazione, clicca sui link dalla tabella sopra.

Inoltre, imparando le Funzioni di Creazione Combinazione e le Funzioni di Creazione Selezione/Partizione, puoi comprendere il quadro completo delle Funzioni di Creazione.

Pubblicato sotto licenza CC-BY-4.0.