12. Observable vs EventListener
// Ritorna una Subscription
observable$.subscribe(observer);
// Non ritorna nulla
document.addEventListener(‘scroll’, function(v) {});
Convenzione
13. Observable vs Promise
// Ritorna una Subscription
observable$.subscribe(observer);
// Ritorna una Promise
myPromise.then(function(v) {})
Convenzione
.then().then()…;
16. Observable
Cos’è?
[ 1, 2, 3, 4, 5 …
Uno stream di dati, come un array, dove ogni
elemento arriva nel tempo
17. Observable
Esempio
import { from } from ‘rxjs’;
const awesome$ = from([1, 2, 3]);
Questo Observable ha già tutti i valori a disposizione,
quindi si comporta in maniera sincrona!
20. Ciclo di vita
1 2 3
Non termina
1 2 3
Completa
1 2 3
Va in errore
21. Observer
Cos’è?
Un Observer è un oggetto che contiene le funzioni di
callback per ogni situazione: emissione, completamento,
errore.
L’Observer viene passato al metodo subscribe dell’Observable
Per creare una subscription.
Può essere sostituito da una o più funzioni
25. Subscription
Rappresenta il contratto fra l’Observer e
l’Observable.
È l’unico modo che abbiamo per terminare un
Observable prima del tempo dall’esterno.
26. const sub = awesome$.subscribe(observer);
sub.unsubscribe();
28. OPERATORI
CREAZIONE PIPEABLE
Creano un Observable
da qualcos’altro
Creano un Observable
da un Observable
Es. Es.
•from
•of
•fromPromise
•interval
•timer
•map
•switch
•filter
•concat
•mergeMap
import { … } from ‘rxjs’ import { … } from ‘rxjs/operators’
29. PIPEABLE OPERATORS
awesome$.pipe(
map(n => n*2),
filter(n => n < 10)
).subscribe(…)
NOTA BENE
NON è stato modificato il vecchio observable (awesome$), ne
è stato creato uno nuovo.
Soltanto, non lo abbiamo salvato in una variabile.
31. awesome$.pipe(
map(n => n*2),
filter(n => n < 10)
).subscribe(…)
CATENA DI OPERATORI
La catena di operatori esegue le stesse operazioni per ogni
valore emesso dall’Observable sorgente (awesome$).
Qualcun altro può comunque sottoscriversi ad awesome$ e
ricevere i valori inalterati.
36. Scenario
awesome$
1 2 3
http$ = ajax(‘URL/number’)
Res
OBSERVER
Per ogni elemento emesso da awesome$, vuole
che sia fatta una chiamata al server per avere la
risposta
40. mergeMap
awesome$.pipe(
mergeMap(n => ajax(‘URL’ + n))
).subscribe(…)
Flattening Observables
Ci pensa mergeMap ad estrapolare ogni valore dall’innerObservable, il
nostro observer riceve i valori “pronti”.
43. Concorrenza
C’è una richiesta in corso, quando ad un tratto ricevi un
nuovo valore. Cosa fai?
mergeMap
switchMap
concatMap
exhaustMap
Ok, eseguo un’altra richiesta concorrente.
L’ordine di risposta non importa.
Scarto la richiesta precedente ed eseguo la
nuova.
Mettiti in coda!
La richiesta precedente non è finita. Non metterti
in coda, mi stai antipatico.
44. Anticipazioni
HOT & COLD
Quando un Observable inizia ad emettere valori?
MULTICASTING
Condividere un Observable con più Observer
SUBJECTS
Ibridi fra Observable che Observer