SlideShare a Scribd company logo
1 of 45
Download to read offline
RXJS
Intro to
Reactive Programming
Michele Stieven
Sviluppatore web e consulente lato front-end
twitter.com/michelestieven
facebook.com/michelestieven
linkedin.com/in/michelestieven
medium.com/@michelestieven
Obiettivi
•Programmazione Reattiva
•Observable
•Observer
•Ciclo di vita
•Operators
•Marble Diagrams
•Higher Order Observables
ES6 (ES2015)
Arrow Functions
function(a, b) {
return a + b;
}
(a, b) => { return a + b; }
(a, b) => a + b
function(a) {
return a*2;
}
a => a*2
function() {
return ‘Hello’;
}
() => ‘Hello’
Programmazione Reattiva?
HEY HEY HEY
time
Ricevuto! Ricevuto! Ricevuto!
Programmare in modo reattivo
significa reagire a degli eventi.
STILE != LINGUAGGIO
Programmazione Reattiva in
JavaScript
addEventListener
Promise
Callback hell
Single value
Unstoppable
Functionalities
RxJS
Reactive Extensions for JavaScript
RxJS elements
•Observable
•Observer
•Subscription
•Operators
•Subjects
•Scheduler
the Observable Pattern
Observable Observer
Subscription
Un observer ascolta un observable attraverso una subscription
Observable vs EventListener
// Ritorna una Subscription
observable$.subscribe(observer);
// Non ritorna nulla
document.addEventListener(‘scroll’, function(v) {});
Convenzione
Observable vs Promise
// Ritorna una Subscription
observable$.subscribe(observer);
// Ritorna una Promise
myPromise.then(function(v) {})
Convenzione
.then().then()…;
Paragone
Promise
•Non cancellabile
•Singolo valore
•Concatenabile
Observable
•Cancellabile
•Valori multipli
•Operatori
Un observable può sempre essere convertito da e in Promise
Observable
Tipi di dato
SINGOLO
VALORE
PIU’
VALORI
SYNC ASYNC
VALUE
ARRAY
PROMISE
OBSERVABLE
Observable
Cos’è?
[ 1, 2, 3, 4, 5 …
Uno stream di dati, come un array, dove ogni
elemento arriva nel tempo
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!
Observable asincroni
Esempi
•Eventi del DOM
•Mouse, tastiera…
•onChange, submit…
•Eventi custom
•Timer
•Chiamate HTTP
Comportamento
•Emettere un valore
•Completarsi
•Andare in errore…
•…e stopparsi
Un Observable può:
Ciclo di vita
1 2 3
Non termina
1 2 3
Completa
1 2 3
Va in errore
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
Observer
Un Observer “completo”
{
next: function() {},
error: function() {},
complete: function() {}
}
Esempio
Observable - Observer
import { from } from ‘rxjs’;
const awesome$ = from([1,2,3]);
awesome$.subscribe({
next: v => console.log(v),
error: e => console.warn(e),
complete: () => console.log(‘Complete’)
});
1
2
3
Complete
Subscription
Rappresenta il contratto fra l’Observer e
l’Observable.
È l’unico modo che abbiamo per terminare un
Observable prima del tempo dall’esterno.
const sub = awesome$.subscribe(observer);
sub.unsubscribe();
Example
Basics
LIVE CODE
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’
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.
awesome$.pipe(
map(n => n*2),
filter(n => n < 10)
).subscribe(…)
const new$ =
const sub$ = new$.subscribe(…)
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.
TANTI
Quanti sono gli operatori?
Tipologie di Operatori
Creazione
of, from, fromEvent, fromPromise…
Combinazione
merge, concat, combineLatest…
Filtraggio
filter, take, debounce, throttle…
Trasformazione
map, reduce, scan…
Gestione degli errori
catchError, retry…
Matematici
count, max, min…
Condizionali
takeUntil, Every…
Utility
tap, delay, materialize…
Multicasting
publish, refCount, share…
Examples
With Marble Diagrams
LIVE CODE
HIGHER ORDER
OBSERVABLES
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
awesome$
1
RESULT
HTTP CALL
2
RESULT
HTTP CALL
3
RESULT
HTTP CALL
Brainstorming
1. Subscribe nel Subscribe
awesome$.subscribe(n => ajax(‘URL’ + n).subscribe(…))
2. Subscribe in map()
awesome$.pipe(
map(n => ajax(‘URL’ + n).subscribe………
3. Unione dei due?
awesome$.pipe(map(n => ajax(‘URL’ + n))).subscribe(new$ => {
new$.subscribe(…)
})
Soluzione
awesome$.pipe(
map(n => ajax(‘URL’ + n)),
mergeAll()
).subscribe(…)
Flattening Observables
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”.
awesome$
1 2 3
ajax(‘URL’ + n)
Res
final$
Res1 Res2 Res3
awesome$.pipe(mergeMap(n => ajax(’URL’ + n))
Problema
Non sappiamo quanto dureranno le chiamate e
se andranno a buon fine!
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.
Anticipazioni
HOT & COLD
Quando un Observable inizia ad emettere valori?
MULTICASTING
Condividere un Observable con più Observer
SUBJECTS
Ibridi fra Observable che Observer
Grazie!

More Related Content

Similar to RxJS - Intro to Reactive Programming

Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.jsMichele Capra
 
Reactive programming principles
Reactive programming principlesReactive programming principles
Reactive programming principlesRiccardo Cardin
 
How To React - Gestione Stato Applicativo
How To React - Gestione Stato ApplicativoHow To React - Gestione Stato Applicativo
How To React - Gestione Stato ApplicativoAldoNoschese
 
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerMatteo Magni
 
Php mysql e cms
Php mysql e cmsPhp mysql e cms
Php mysql e cmsorestJump
 
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...Donato Clun
 
EcmaScript 6 & 7
EcmaScript 6 & 7EcmaScript 6 & 7
EcmaScript 6 & 7BENTOSA
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Object Oriented JavaScript con TypeScript
Object Oriented JavaScript con TypeScriptObject Oriented JavaScript con TypeScript
Object Oriented JavaScript con TypeScriptSilvia Gioia Florio
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a JavascriptRiccardo Piccioni
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)STELITANO
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 

Similar to RxJS - Intro to Reactive Programming (20)

Introduzione a Node.js
Introduzione a Node.jsIntroduzione a Node.js
Introduzione a Node.js
 
Umarells
UmarellsUmarells
Umarells
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Reactive programming principles
Reactive programming principlesReactive programming principles
Reactive programming principles
 
How To React - Gestione Stato Applicativo
How To React - Gestione Stato ApplicativoHow To React - Gestione Stato Applicativo
How To React - Gestione Stato Applicativo
 
Rx - ReactiveX
Rx - ReactiveXRx - ReactiveX
Rx - ReactiveX
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
 
Javascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesignerJavascript - 7 | WebMaster & WebDesigner
Javascript - 7 | WebMaster & WebDesigner
 
Php mysql e cms
Php mysql e cmsPhp mysql e cms
Php mysql e cms
 
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
Migrazione dei meccanismi di workflow di un sistema informativo assicurativo ...
 
EcmaScript 6 & 7
EcmaScript 6 & 7EcmaScript 6 & 7
EcmaScript 6 & 7
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
08 mapreduce
08   mapreduce08   mapreduce
08 mapreduce
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
Object Oriented JavaScript con TypeScript
Object Oriented JavaScript con TypeScriptObject Oriented JavaScript con TypeScript
Object Oriented JavaScript con TypeScript
 
Yagwto
YagwtoYagwto
Yagwto
 
Javascript
JavascriptJavascript
Javascript
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascript
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 

RxJS - Intro to Reactive Programming