SlideShare une entreprise Scribd logo
1  sur  10
Télécharger pour lire hors ligne
#DevoxxFR @nicoespeon
À la découverte
des Observables
Nicolas Carlo @nicoespeon
1 2 3 4
#DevoxxFR @nicoespeon
Pour ceux qui n’en ont jamais manipulé
Pour apprendre ce que c’est
Pour comprendre à quoi ça sert
1 2 3
#DevoxxFR @nicoespeon
Kézako, Observables ?
Un événement
Une erreur
Flux terminé
« Think of it as an asynchronous immutable array »
- 2 minute introduction to Rx by Andre Staltz
Lazy
Tout type d’événements
http://reactivex.io/
Microsoft
Java, JS, Scala,
Python, Swift…
Opérateurs
Marble Diagrams
Dans le code
http://rxmarbles.com/
Intérêts ?
Code déclaratif
Simple et composable
Manipuler flux 

événements asynchrones
temps
// -1----2-4---X--|->
#DevoxxFR @nicoespeon
« Si l’utilisateur s’excite sur la souris, 

lance une vidéo de chatons pour le calmer »
« Si l’utilisateur s’excite sur la souris, 

lance une vidéo de chatons pour le calmer »
Exemple : clics multiples
#DevoxxFR @nicoespeon
let numberOfClicks = 0
let handleClicksTimeout
document.addEventListener('click', () => {
clear(handleClicksTimeout)
numberOfClicks++
handleClicksTimeout = setTimeout(() => {
if (numberOfClicks >= 2) {
console.log(`${numberOfClicks} clicks`)
}
numberOfClicks = 0
}, 250)
})
Exemple : clics multiples
#DevoxxFR @nicoespeon
click$
multiClick$
buffer(click$.debounce(250))
map(x => x.length)
1 5 11 2 1
filter(x => x >= 2)
5 2
#DevoxxFR @nicoespeon
Exemple : clics multiples
const click$ = Rx.Observable.fromEvent(document, 'click')
const multiClick$ = click$
.buffer(click$.debounce(250))
.map((buffer) => buffer.length)
.filter((length) => length >= 2)
multiClick$.subscribe(
(numberOfClicks) => console.log(`${numberOfClicks} clicks`)
)
1 2 1 3 1
2 3
#DevoxxFR @nicoespeon
Take Away
‣ Pas de compteur, pas de timeout, pas de micro-gestion
‣ Code déclaratif, plus simple à raisonner / tester / faire évoluer
‣ Side-effects dans subscribe = Separation of Concerns
‣ Flux ré-utilisables = ajout de features sans peur !
const click$ = Rx.Observable.fromEvent(document, 'click')
const multiClick$ = click$
.buffer(click$.debounce(250))
.map((buffer) => buffer.length)
.filter((length) => length >= 2)
multiClick$.subscribe(
(numberOfClicks) => console.log(`${numberOfClicks} clicks`)
)
#DevoxxFR @nicoespeon
Pour aller plus loin
‣ The introduction to Reactive Programming you've been missing
‣ RxJS Functions with Examples
‣ Using Observables in real life
‣ Testing reactive code
‣ Reactive Programming - What is RxJS? (lessons)
‣ The whole future declared in a var (video)
‣ Dynamics of Change - Why Reactivity matters (PDF)
‣ Reactive Extensions (Rx.js) Workshop (kata)
#DevoxxFR @nicoespeon
Rx.Observable.of('Thanks')

Contenu connexe

Similaire à À la découverte des observables

Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?
Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?
Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?Ruau Mickael
 
Devoxx 2018 : Chaos Engineering
Devoxx 2018 : Chaos EngineeringDevoxx 2018 : Chaos Engineering
Devoxx 2018 : Chaos EngineeringBenjamin Gakic
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Frank Denis
 
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cashSthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cashStHack
 
Slides du meetup devops aix-marseille d'ocotbre 2023
Slides du meetup devops aix-marseille d'ocotbre 2023Slides du meetup devops aix-marseille d'ocotbre 2023
Slides du meetup devops aix-marseille d'ocotbre 2023Frederic Leger
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?Ruau Mickael
 
Journées SQL Server 2011 Extended Events
Journées SQL Server 2011  Extended Events Journées SQL Server 2011  Extended Events
Journées SQL Server 2011 Extended Events David BAFFALEUF
 
Nouveautés de zabbix 3.0 par Alain Ganuchaud
Nouveautés de zabbix 3.0 par Alain GanuchaudNouveautés de zabbix 3.0 par Alain Ganuchaud
Nouveautés de zabbix 3.0 par Alain GanuchaudAlain Ganuchaud
 
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way. Par Pascal Edoua...
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way.  Par Pascal Edoua...XebiCon'16 : WeScale - DNS as a Service, the OpenStack way.  Par Pascal Edoua...
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way. Par Pascal Edoua...Publicis Sapient Engineering
 
Gestion et surveillance du reseau syslogng
Gestion et surveillance du reseau  syslogngGestion et surveillance du reseau  syslogng
Gestion et surveillance du reseau syslogngKiemde Franck
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesXavier MARIN
 

Similaire à À la découverte des observables (20)

Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?
Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?
Barbie explique IEEE754 : pourquoi les calculs informatiques sont faux?
 
Devoxx 2018 : Chaos Engineering
Devoxx 2018 : Chaos EngineeringDevoxx 2018 : Chaos Engineering
Devoxx 2018 : Chaos Engineering
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2)
 
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cashSthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
Sthack 2015 - David Berard & Vincent Fargues - Attack the cache to get some cash
 
Apache Beam
Apache Beam Apache Beam
Apache Beam
 
Implementing a key/value store
Implementing a key/value storeImplementing a key/value store
Implementing a key/value store
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Slides du meetup devops aix-marseille d'ocotbre 2023
Slides du meetup devops aix-marseille d'ocotbre 2023Slides du meetup devops aix-marseille d'ocotbre 2023
Slides du meetup devops aix-marseille d'ocotbre 2023
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Javascript : que fait ce code?
Javascript : que fait ce code?Javascript : que fait ce code?
Javascript : que fait ce code?
 
Journées SQL Server 2011 Extended Events
Journées SQL Server 2011  Extended Events Journées SQL Server 2011  Extended Events
Journées SQL Server 2011 Extended Events
 
Javascript proprement
Javascript proprementJavascript proprement
Javascript proprement
 
Nouveautés de zabbix 3.0 par Alain Ganuchaud
Nouveautés de zabbix 3.0 par Alain GanuchaudNouveautés de zabbix 3.0 par Alain Ganuchaud
Nouveautés de zabbix 3.0 par Alain Ganuchaud
 
Networxx (intro et fin)
Networxx (intro et fin)Networxx (intro et fin)
Networxx (intro et fin)
 
Formation python
Formation pythonFormation python
Formation python
 
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way. Par Pascal Edoua...
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way.  Par Pascal Edoua...XebiCon'16 : WeScale - DNS as a Service, the OpenStack way.  Par Pascal Edoua...
XebiCon'16 : WeScale - DNS as a Service, the OpenStack way. Par Pascal Edoua...
 
Gestion et surveillance du reseau syslogng
Gestion et surveillance du reseau  syslogngGestion et surveillance du reseau  syslogng
Gestion et surveillance du reseau syslogng
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 

Plus de Nicolas Carlo

The Secrets of Hexagonal Architecture
The Secrets of Hexagonal ArchitectureThe Secrets of Hexagonal Architecture
The Secrets of Hexagonal ArchitectureNicolas Carlo
 
Hexagonal architecture & Elixir
Hexagonal architecture & ElixirHexagonal architecture & Elixir
Hexagonal architecture & ElixirNicolas Carlo
 
À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017Nicolas Carlo
 
Testing Marionette.js Behaviors
Testing Marionette.js BehaviorsTesting Marionette.js Behaviors
Testing Marionette.js BehaviorsNicolas Carlo
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreNicolas Carlo
 
Les générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienLes générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienNicolas Carlo
 
Kanban et Game Development avec Trello
Kanban et Game Development avec TrelloKanban et Game Development avec Trello
Kanban et Game Development avec TrelloNicolas Carlo
 
Plop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidienPlop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidienNicolas Carlo
 
Tester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.jsTester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.jsNicolas Carlo
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreNicolas Carlo
 
Comment organiser un gros projet backbone
Comment organiser un gros projet backboneComment organiser un gros projet backbone
Comment organiser un gros projet backboneNicolas Carlo
 

Plus de Nicolas Carlo (11)

The Secrets of Hexagonal Architecture
The Secrets of Hexagonal ArchitectureThe Secrets of Hexagonal Architecture
The Secrets of Hexagonal Architecture
 
Hexagonal architecture & Elixir
Hexagonal architecture & ElixirHexagonal architecture & Elixir
Hexagonal architecture & Elixir
 
À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017À la découverte des Observables - HumanTalks Paris 2017
À la découverte des Observables - HumanTalks Paris 2017
 
Testing Marionette.js Behaviors
Testing Marionette.js BehaviorsTesting Marionette.js Behaviors
Testing Marionette.js Behaviors
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscore
 
Les générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienLes générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidien
 
Kanban et Game Development avec Trello
Kanban et Game Development avec TrelloKanban et Game Development avec Trello
Kanban et Game Development avec Trello
 
Plop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidienPlop : un micro-générateur pour se simplifier la vie au quotidien
Plop : un micro-générateur pour se simplifier la vie au quotidien
 
Tester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.jsTester ses Behaviors Marionette.js
Tester ses Behaviors Marionette.js
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscore
 
Comment organiser un gros projet backbone
Comment organiser un gros projet backboneComment organiser un gros projet backbone
Comment organiser un gros projet backbone
 

À la découverte des observables

  • 1. #DevoxxFR @nicoespeon À la découverte des Observables Nicolas Carlo @nicoespeon 1 2 3 4
  • 2. #DevoxxFR @nicoespeon Pour ceux qui n’en ont jamais manipulé Pour apprendre ce que c’est Pour comprendre à quoi ça sert 1 2 3
  • 3. #DevoxxFR @nicoespeon Kézako, Observables ? Un événement Une erreur Flux terminé « Think of it as an asynchronous immutable array » - 2 minute introduction to Rx by Andre Staltz Lazy Tout type d’événements http://reactivex.io/ Microsoft Java, JS, Scala, Python, Swift… Opérateurs Marble Diagrams Dans le code http://rxmarbles.com/ Intérêts ? Code déclaratif Simple et composable Manipuler flux 
 événements asynchrones temps // -1----2-4---X--|->
  • 4. #DevoxxFR @nicoespeon « Si l’utilisateur s’excite sur la souris, 
 lance une vidéo de chatons pour le calmer » « Si l’utilisateur s’excite sur la souris, 
 lance une vidéo de chatons pour le calmer » Exemple : clics multiples
  • 5. #DevoxxFR @nicoespeon let numberOfClicks = 0 let handleClicksTimeout document.addEventListener('click', () => { clear(handleClicksTimeout) numberOfClicks++ handleClicksTimeout = setTimeout(() => { if (numberOfClicks >= 2) { console.log(`${numberOfClicks} clicks`) } numberOfClicks = 0 }, 250) }) Exemple : clics multiples
  • 7. #DevoxxFR @nicoespeon Exemple : clics multiples const click$ = Rx.Observable.fromEvent(document, 'click') const multiClick$ = click$ .buffer(click$.debounce(250)) .map((buffer) => buffer.length) .filter((length) => length >= 2) multiClick$.subscribe( (numberOfClicks) => console.log(`${numberOfClicks} clicks`) ) 1 2 1 3 1 2 3
  • 8. #DevoxxFR @nicoespeon Take Away ‣ Pas de compteur, pas de timeout, pas de micro-gestion ‣ Code déclaratif, plus simple à raisonner / tester / faire évoluer ‣ Side-effects dans subscribe = Separation of Concerns ‣ Flux ré-utilisables = ajout de features sans peur ! const click$ = Rx.Observable.fromEvent(document, 'click') const multiClick$ = click$ .buffer(click$.debounce(250)) .map((buffer) => buffer.length) .filter((length) => length >= 2) multiClick$.subscribe( (numberOfClicks) => console.log(`${numberOfClicks} clicks`) )
  • 9. #DevoxxFR @nicoespeon Pour aller plus loin ‣ The introduction to Reactive Programming you've been missing ‣ RxJS Functions with Examples ‣ Using Observables in real life ‣ Testing reactive code ‣ Reactive Programming - What is RxJS? (lessons) ‣ The whole future declared in a var (video) ‣ Dynamics of Change - Why Reactivity matters (PDF) ‣ Reactive Extensions (Rx.js) Workshop (kata)