SlideShare une entreprise Scribd logo
Streams
Highland et compagnie
Guillaume Gautreau
Lead developer @ReportLinker
@ghusse
https://www.ghusse.com
Feedbacks
http://speakerscore.com/BX1L
Contact
@ghusse
guillaume@ghusse.com
Programme
● Pourquoi les streams
● Highland : API & caractéristiques
● Bonnes pratiques
En 2015
@mpjme
Youtube: funfunfunction
Je découvre FunFunFunction
Janvier 2016
Janvier 2016: vidéo sur les streams
Présentation de :
● highlandjs
● baconjs
● ReactiveX
Les streams
Ça a l’air sympa
Mais je ne vois pas trop
dans quels cas ça pourrait
nous être utile
Moi, Janvier 2016
1 an
plus tard
Utilisation chez ReportLinker
12
42
Projets
node
Projets dépendant
de highland
On a trouvé !
Qui utilise les
promesses ?
Et puis un jour...
Lancer un traitement sur
tous les enregistrements
d’une API paginée
Exemple
http://jsonplaceholder.typicode.com
/posts 100 items
/comments 500 items
/albums 100 items
/photos 5000 items
/todos 200 items
/users 10 items
Exemple
http://jsonplaceholder.typicode.com
/posts 100 items
/comments 500 items
/albums 100 items
/photos 5000 items
/todos 200 items
/users 10 items
const promiseLoad =
require('./paginationPromise');
promiseLoad()
.then(console.log);
const photos = require('./jsonPlaceholder').photos;
function loadFromPage(page, results = []){
return photos.list({ page })
.then(response => {
const nextResults = results.concat(response.results);
if (page >= response.pages){
return results;
}
return loadFromPage(page + 1, nextResults);
});
}
Code
https://github.com/ghusse/lyonjs-streams-code
Chargement avec promesses
1. Charge TOUT en mémoire
2. Attend 19s avant de pouvoir continuer
Et si on pouvait traiter
les résultats
au fil de l’eau ?
const promiseCallbackLoad =
require('./paginationPromiseWithCallbacks')
promiseCallbackLoad(
(error, result) => console.log(result)
).then(() => console.log('done'));
return photos.list({ page })
.then(response => {
response.results
.forEach(result => callback(undefined, result)));
if (page >= response.pages){
return;
}
return loadFromPage(page + 1, callback);
})
.catch(error => callback(error));
return photos.list({ page })
.then(response => {
response.results
.forEach(result => callback(undefined, result)));
if (page >= response.pages){
return;
}
return loadFromPage(page + 1, callback);
})
.catch(error => callback(error));
Promises
Callbacks
Welcome to callback hell, again
1. Gestion d’erreurs
2. Traitement asynchrone dans les callbacks
3. Regroupement des résultats
4. Ressources (mémoire, flood réseau etc)
Promesses
+ Lisibilité du code
+ Chaînage des actions
+ Gestion d’erreur
− Un seul résultat
− Callback appelé une
fois à la fin
Promesses + callbacks
+ Flexibilité
− Gestion d’erreur
− Lisibilité du code
− Chaînage des appels
Promesses
+
Callbacks
Promesses
+
Callbacks
Promesses
+
Streams
Promesses
+
Streams
Asynchronisme
Gestion d’erreur
Gestion du flux
Ressources
const streamLoad =
require("./paginationStream");
streamLoad()
.each(console.log)
.done();
const streamLoad =
require("./paginationStream");
streamLoad()
.each(console.log)
.done();
API
Exemple :
récupérer les URLs
{
"albumId": 1,
"id": 1,
"title": "accusamus beatae ad facilis cum
similique qui sunt",
"url": "http://placehold.it/600/92c952",
"thumbnailUrl": "http://placehold.it/150/30ac17"
}
{
"albumId": 1,
"id": 1,
"title": "accusamus beatae ad facilis cum
similique qui sunt",
"url": "http://placehold.it/600/92c952",
"thumbnailUrl": "http://placehold.it/150/30ac17"
}
const streamLoad =
require("./paginationStream");
streamLoad()
.map(photo => photo.url)
.each(console.log)
.done();
Exemple :
Uniquement les
photos avec un
titre de + de 4 mots
const streamLoad =
require("./paginationStream");
streamLoad()
.filter(
photo => photo.title.split(' ')
.length > 4
)
.map(photo => photo.url)
.each(console.log)
.done()
Quizz
Répondez au signal
Citez une 4ème
fonction sur les
streams
Méthodes sur les streams
each
map
filter
Méthodes sur les streams
each
map
filter
GO !
Méthodes sur les streams
each
map
filter
reduce
Méthodes sur les streams
each
map
filter
reduce
Programmation
fonctionnelle comme
sur les tableaux, mais
au fil de l’eau
Méthodes sur les streams
each
map
filter
reduce
Méthodes synchrones
Asynchronisme
Exemple
/posts 100 items
/comments 500 items
/albums 100 items
/photos 5000 items
/todos 200 items
/users 10 items
http://jsonplaceholder.typicode.com
1. Lister les albums
2. Récupérer la liste des photos
de chaque album
Exemple
/posts 100 items
/comments 500 items
/albums 100 items
/photos 5000 items
/todos 200 items
/users 10 items
http://jsonplaceholder.typicode.com
1. Lister les albums
2. Récupérer la liste des photos
de chaque album
PS : tout est paginé
const streamLoad = require("./paginationStream");
const { photos, albums } = require('./jsonPlaceholder');
streamLoad(albums)
.flatMap(album =>
streamLoad(photos, { albumId: album.id }))
.filter(photo => photo.title.split(' ').length > 4)
.map(photo => photo.url)
.each(console.log)
.done();
flatmap
=
map asynchrone
flatmap
● Chaque élément du stream est mappé en un
nouveau stream
● Le contenu de chaque stream est envoyé dans le
stream
flatMap vs map
streamLoad(albums)
.flatMap(album =>
streamLoad(photos,
{ albumId: album.id }))
.each(console.log)
.done();
streamLoad(albums)
.map(album =>
streamLoad(photos,
{ albumId: album.id }))
.each(console.log)
.done();
// Une ligne de log par PHOTO
{ albumId: 1, id: 1, ...
{ albumId: 1, id: 2, ...
// Une ligne par ALBUM
Stream { domain: null, ...
flatFilter vs filter
Synchrone Asynchrone
.map .flatMap
.filter .flatFilter
flatFilter vs filter
Synchrone Asynchrone
.map .flatMap .map().sequence()
.filter .flatFilter
Promesses
+
Streams
FlatMap
.flatMap( )
Fonction qui doit renvoyer un
stream highland
Créer un stream Higland
const highland = require('highland');
const promise = Promise.resolve('value');
const stream = highland(promise);
FlatMap
.flatMap(highland( ))
Fonction qui renvoie
une promesse
Créer un stream highland
● Array
● Iterator
● Iterable
● Promise
● Readable stream
● Events
● Function
Créer un stream highland
● Array
● Iterator
● Iterable
● Promise
● Readable stream
● Events
● Function
Traitements asynchrones
Créer un stream highland
● Array
● Iterator
● Iterable
● Promise
● Readable stream
● Events
● Function
Fichiers, requêtes HTTP
Créer un stream highland
● Array
● Iterator
● Iterable
● Promise
● Readable stream
● Events
● Function
Événements DOM (client)
Créer un stream highland
● Array
● Iterator
● Iterable
● Promise
● Readable stream
● Events
● Function
Créer ses propres streams
back
pressure
Back-pressure
streamLoad(albums)
.tap(() => console.log(new Date(), "album"))
.flatMap(album =>
streamLoad(photos, { albumId: album.id }))
.each(photo => { /*NOOP*/ });
Back-pressure
streamLoad(albums)
.tap(() => console.log(new Date(), "album"))
.flatMap(album =>
streamLoad(photos, { albumId: album.id }))
.each(photo => { /*NOOP*/ });
Back-pressure
streamLoad(albums)
.tap(() => console.log(new Date(), "album"))
.flatMap(album =>
streamLoad(photos, { albumId: album.id }))
.each(photo => { /*NOOP*/ });
Code 1 avec flatMap
Back-pressure
streamLoad(albums)
.tap(() => console.log(new Date(), "album"))
/*.flatMap(album =>
streamLoad(photos, { albumId: album.id }))*/
.each(album => { /*NOOP*/ });
Code 2 sans flatMap
Back-pressure
Avec flatMap Sans flatMap
Back-Pressure
● Laziness
● S’adapte au plus lent
Back-pressure
Avec flatMap Sans flatMap
Back-Pressure
● Laziness
● S’adapte au plus lent
● Chargement différé (source)
Récap’
API
map/filter/reduce/tap
flatMap/flatFilter
ctor : promise, function
API
map/filter/reduce/tap
flatMap/flatFilter
ctor : promise, function
batch/sequence
errors/stopOnError
rateLimit
fork/merge
pipe
http://highlandjs.org
3 bonnes
pratiques
Gérer les erreurs
Gérer les erreurs
source
.stopOnError(
error => {
// Do something
}
).done();
source
.errors(
(error, push) => {
// Do something
}
).done();
Utiliser next dans
la création de
stream
Utiliser next
return highland((push, next) => {});
Pousser une valeur
dans le stream
Utiliser next
return highland((push, next) => {});
Pousser une valeur
dans le stream
Rediriger vers un
autre stream
Utiliser next
return highland((push, next) => {});
Pousser une valeur
dans le stream
Rediriger vers un
autre stream
back
pressure
Streams =
où c’est nécessaire,
promesses =
partout ailleurs
const getThing = require('./getThing');
source
.flatMap(getThing)
.done();
Streams où c’est nécessaire
getThing doit
renvoyer un stream
Streams où c’est nécessaire
const getThing = require('./getThing');
source
.flatMap(v => highland(getThing(v)))
.done();
getThing renvoie
une promesse
Streams limités à ce
traitement
Streams où c’est nécessaire
return new Promise((resolve, reject) => {
stream
.stopOnError(reject)
.collect().toArray(resolve);
});
Feedbacks
http://speakerscore.com/BX1L
Contact
@ghusse
guillaume@ghusse.com

Contenu connexe

Similaire à Streams avec HighlandJS

Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
codedarmor
 
CasperJS
CasperJSCasperJS
CasperJS
Kévin Lion
 
Glenn Jones : "Réutiliser les data existantes des médias sociaux"
Glenn Jones : "Réutiliser les data existantes des médias sociaux"Glenn Jones : "Réutiliser les data existantes des médias sociaux"
Glenn Jones : "Réutiliser les data existantes des médias sociaux"
Christophe Ducamp
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slides
Oxalide
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performance
Ludovic Piot
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
Kenny Dits
 
HTML5
HTML5HTML5
HTML5
Neovov
 
Resource Oriented Architecture
Resource Oriented ArchitectureResource Oriented Architecture
Resource Oriented Architecture
DNG Consulting
 
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
Clément OUDOT
 
jQuery mobile / PhoneGap : contenus dynamiques client-side
jQuery mobile / PhoneGap : contenus dynamiques client-sidejQuery mobile / PhoneGap : contenus dynamiques client-side
jQuery mobile / PhoneGap : contenus dynamiques client-side
maru.maru
 
Présentation de Ruby on Rails
Présentation de Ruby on RailsPrésentation de Ruby on Rails
Présentation de Ruby on RailsJulien Blin
 
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Rémi Prévost
 
RennesJS Talk webperf by Dareboost
RennesJS Talk webperf by DareboostRennesJS Talk webperf by Dareboost
RennesJS Talk webperf by Dareboost
Damien Jubeau
 
Introduction à la webperf
Introduction à la webperfIntroduction à la webperf
Introduction à la webperf
Jean-Pierre Vincent
 
Active Server Pages (ASP)
Active Server Pages (ASP)Active Server Pages (ASP)
Active Server Pages (ASP)
Saïd Radhouani
 
Web et communication
Web et communicationWeb et communication
Web et communication
laureno
 
Dcparis atelier site_media_juin 2013
Dcparis atelier site_media_juin 2013Dcparis atelier site_media_juin 2013
Dcparis atelier site_media_juin 2013Pierre Cotiniere
 
Webperf Front-End SeoCampus 2012
Webperf Front-End SeoCampus 2012Webperf Front-End SeoCampus 2012
Webperf Front-End SeoCampus 2012
Refficience
 
L avenir du web au prisme de la resource
L avenir du web au prisme de la resourceL avenir du web au prisme de la resource
L avenir du web au prisme de la resource
Fabien Gandon
 
Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.js
Julien Giovaresco
 

Similaire à Streams avec HighlandJS (20)

Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et JavascriptCodedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascript
 
CasperJS
CasperJSCasperJS
CasperJS
 
Glenn Jones : "Réutiliser les data existantes des médias sociaux"
Glenn Jones : "Réutiliser les data existantes des médias sociaux"Glenn Jones : "Réutiliser les data existantes des médias sociaux"
Glenn Jones : "Réutiliser les data existantes des médias sociaux"
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slides
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performance
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
 
HTML5
HTML5HTML5
HTML5
 
Resource Oriented Architecture
Resource Oriented ArchitectureResource Oriented Architecture
Resource Oriented Architecture
 
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
 
jQuery mobile / PhoneGap : contenus dynamiques client-side
jQuery mobile / PhoneGap : contenus dynamiques client-sidejQuery mobile / PhoneGap : contenus dynamiques client-side
jQuery mobile / PhoneGap : contenus dynamiques client-side
 
Présentation de Ruby on Rails
Présentation de Ruby on RailsPrésentation de Ruby on Rails
Présentation de Ruby on Rails
 
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
Développement Web sur iPhone (iPhone+iPad DevCamp Québec)
 
RennesJS Talk webperf by Dareboost
RennesJS Talk webperf by DareboostRennesJS Talk webperf by Dareboost
RennesJS Talk webperf by Dareboost
 
Introduction à la webperf
Introduction à la webperfIntroduction à la webperf
Introduction à la webperf
 
Active Server Pages (ASP)
Active Server Pages (ASP)Active Server Pages (ASP)
Active Server Pages (ASP)
 
Web et communication
Web et communicationWeb et communication
Web et communication
 
Dcparis atelier site_media_juin 2013
Dcparis atelier site_media_juin 2013Dcparis atelier site_media_juin 2013
Dcparis atelier site_media_juin 2013
 
Webperf Front-End SeoCampus 2012
Webperf Front-End SeoCampus 2012Webperf Front-End SeoCampus 2012
Webperf Front-End SeoCampus 2012
 
L avenir du web au prisme de la resource
L avenir du web au prisme de la resourceL avenir du web au prisme de la resource
L avenir du web au prisme de la resource
 
Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.js
 

Dernier

De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'universitéDe l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
Université de Franche-Comté
 
COURS D'ADMINISTRATION RESEAU SOUS WINDOWS
COURS D'ADMINISTRATION RESEAU  SOUS WINDOWSCOURS D'ADMINISTRATION RESEAU  SOUS WINDOWS
COURS D'ADMINISTRATION RESEAU SOUS WINDOWS
AlbertSmithTambwe
 
Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024
UNITECBordeaux
 
Les écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptxLes écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptx
abderrahimbourimi
 
OCTO TALKS : 4 Tech Trends du Software Engineering.pdf
OCTO TALKS : 4 Tech Trends du Software Engineering.pdfOCTO TALKS : 4 Tech Trends du Software Engineering.pdf
OCTO TALKS : 4 Tech Trends du Software Engineering.pdf
OCTO Technology
 
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptxPRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
AlbertSmithTambwe
 
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...
OCTO Technology
 
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Laurent Speyser
 
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
OCTO Technology
 

Dernier (9)

De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'universitéDe l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
 
COURS D'ADMINISTRATION RESEAU SOUS WINDOWS
COURS D'ADMINISTRATION RESEAU  SOUS WINDOWSCOURS D'ADMINISTRATION RESEAU  SOUS WINDOWS
COURS D'ADMINISTRATION RESEAU SOUS WINDOWS
 
Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024
 
Les écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptxLes écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptx
 
OCTO TALKS : 4 Tech Trends du Software Engineering.pdf
OCTO TALKS : 4 Tech Trends du Software Engineering.pdfOCTO TALKS : 4 Tech Trends du Software Engineering.pdf
OCTO TALKS : 4 Tech Trends du Software Engineering.pdf
 
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptxPRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
 
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...
 
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
 
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
 

Streams avec HighlandJS