La scorsa settimana ho risposto a una domanda su RxJS in cui ho avuto una discussione con un altro membro della comunità in merito a: "Devo creare un abbonamento per ogni specifico effetto collaterale o devo cercare di ridurre al minimo gli abbonamenti in generale?" Voglio sapere quale metologia usare in termini di un approccio applicativo completamente reattivo o quando passare da uno all'altro. Questo aiuterà me e forse altri ad evitare discussioni sconnesse.
Informazioni sulla configurazione
- Tutti gli esempi sono in TypeScript
- Per focalizzarsi meglio sulla domanda, non utilizzare cicli di vita / costruttori per gli abbonamenti e mantenere un framework non correlato
- Immagina: le sottoscrizioni vengono aggiunte in init costruttore / ciclo di vita
- Immagina: l'annullamento dell'iscrizione avviene nel ciclo di vita
Che cos'è un effetto collaterale (campione angolare)
- Aggiornamento / input nell'interfaccia utente (ad es.
value$ | async
) - Output / upstream di un componente (ad es.
@Output event = event$
) - Interazione tra servizi diversi su gerarchie diverse
Caso d'uso esemplare:
- Due funzioni:
foo: () => void; bar: (arg: any) => void
- Due fonti osservabili:
http$: Observable<any>; click$: Observable<void>
foo
viene chiamato dopo chehttp$
è stato emesso e non ha bisogno di alcun valorebar
viene chiamato dopo l'click$
emissione, ma richiede il valore corrente dihttp$
Caso: crea un abbonamento per ogni specifico effetto collaterale
const foo$ = http$.pipe(
mapTo(void 0)
);
const bar$ = http$.pipe(
switchMap(httpValue => click$.pipe(
mapTo(httpValue)
)
);
foo$.subscribe(foo);
bar$.subscribe(bar);
Caso: ridurre al minimo gli abbonamenti in generale
http$.pipe(
tap(() => foo()),
switchMap(httpValue => click$.pipe(
mapTo(httpValue )
)
).subscribe(bar);
La mia opinione in breve
Posso capire il fatto che gli abbonamenti rendono i paesaggi Rx più complessi all'inizio, perché devi pensare a come gli abbonati dovrebbero influenzare la pipa o meno, ad esempio (condividi il tuo osservabile o meno). Ma più separi il tuo codice (più ti concentri: cosa succede quando) più facile è mantenere (testare, eseguire il debug, aggiornare) il tuo codice in futuro. Con questo in mente, creo sempre un'unica fonte osservabile e una singola sottoscrizione per qualsiasi effetto collaterale nel mio codice. Se due o più effetti collaterali che ho sono innescati dalla stessa identica fonte osservabile, quindi condivido il mio osservabile e sottoscrivo individualmente ogni effetto collaterale, perché può avere cicli di vita diversi.