Quali operatori per lavorare con i flussi conosci?
sobes.tech AI
Risposta dell'AI
Gli operatori per lavorare con i flussi di dati, particolarmente rilevanti nel contesto della programmazione asincrona e delle librerie reattive (come RxJS), possono essere suddivisi in diverse categorie.
Operatori di creazione (Creation Operators): Utilizzati per creare un nuovo flusso di dati.
of(): Crea un flusso che emette un insieme fisso di valori.// Di RxJS import { of } from 'rxjs'; const source = of(1, 2, 3); // Flusso che emette 1, 2, 3from(): Trasforma diverse fonti di dati (Promise, Iterable, ArrayLike) in un flusso.// Di RxJS import { from } from 'rxjs'; const source = from([10, 20, 30]); // Flusso da un arrayinterval(): Crea un flusso che emette numeri sequenziali a intervalli di tempo definiti.// Di RxJS import { interval } from 'rxjs'; const source = interval(1000); // Flusso che emette numeri ogni secondotimer(): Crea un flusso che emette un valore dopo un tempo definito, eventualmente con valori successivi a intervalli.fromEvent(): Crea un flusso da eventi DOM o EventEmitter.
Operatori di trasformazione (Transformation Operators): Modificano i valori emessi dal flusso.
map(): Trasforma ogni valore, applicandogli una funzione.// Di RxJS import { of } from 'rxjs'; import { map } from 'rxjs/operators'; const source = of(1, 2, 3); const result = source.pipe(map(x => x * 2)); // Flusso con valori 2, 4, 6pluck(): Estrae una proprietà da ogni oggetto emesso.scan(): Applica una funzione di accumulo a ogni valore del flusso e emette i risultati intermedi.mergeMap()/flatMap(): Proietta ogni valore del flusso originale in un nuovo flusso (Observable interno) e li combina in un unico flusso di uscita. Permette di eseguire operazioni asincrone per ogni valore.// Di RxJS import { of } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; const source = of(1, 2); const result = source.pipe(mergeMap(val => of(val + 'a', val + 'b'))); // Flusso con valori '1a', '1b', '2a', '2b'switchMap(): Simile amergeMap, ma al emettere un nuovo valore, annulla il lavoro del precedente flusso interno. Utile per autocompletamento o richieste con cancellazione.concatMap(): Simile amergeMap, ma garantisce che i flussi interni siano eseguiti in sequenza.
Operatori di filtraggio (Filtering Operators): Permettono di passare selettivamente i valori emessi.
filter(): Passa solo i valori che soddisfano una condizione.// Di RxJS import { of } from 'rxjs'; import { filter } from 'rxjs/operators'; const source = of(1, 2, 3, 4); const result = source.pipe(filter(x => x % 2 === 0)); // 2, 4take(): Prende solo i primi N valori.takeUntil(): Prende valori finché un altro flusso non emette.skip(): Ignora i primi N valori.debounceTime(): Emissione di un valore solo dopo che il flusso è rimasto inattivo per un certo tempo. Utile per evitare azioni troppo frequenti.distinctUntilChanged(): Emissione di un valore solo se diverso dal precedente.
Operatori di combinazione (Combination Operators): Combinano più flussi in uno.
combineLatest(): Combina gli ultimi valori di più flussi, emettendo un array con questi ultimi valori ogni volta che uno di essi cambia.zip(): Combina i valori di più flussi in un array per indice.merge(): Fonde più flussi, emettendo i loro valori non appena arrivano.concat(): Esegue più flussi in sequenza.
Operatori di gestione degli errori (Error Handling Operators): Definiscono il comportamento in caso di errori.
catchError(): Cattura un errore e permette di continuare o sostituire il flusso.// Di RxJS import { throwError } from 'rxjs'; import { catchError, of } from 'rxjs/operators'; const source = throwError(() => new Error('Qualcosa è andato storto')); const result = source.pipe(catchError(err => of('Errore catturato'))); // Flusso con valore 'Errore catturato'retry(): Tenta di sottoscrivere N volte di nuovo in caso di errore.
Operatori di completamento (Completion Operators): Definiscono azioni al termine del flusso.
finalize(): Esegue un'azione al termine o alla cancellazione.tap(): Permette effetti collaterali senza modificare i valori.
Questa non è una lista esaustiva, ma copre gli operatori più importanti con cui si lavora frequentemente nello sviluppo frontend, specialmente con approccio reattivo.