
Commençons notre série sur les Observables avec une présentation de la classe, à quoi elle sert. Nous les comparerons avec les Promises, et nous verrons pourquoi elles sont bien plus puissantes !
Programmation réactive et pattern Observer
Les Observables de RxJs se basent sur le pattern Observer :
- Un observable qui émet des informations
- Des observers qui écoutent
Il s’agit d’une programmation rĂ©active (l’opposĂ© de la programmation passive, oĂč l’on demande les informations, ici, on va y souscrire).
Un tuyau passif
Une approche pratique de voir les observables est de les comparer Ă une persone qui cherche Ă arroser son jardin.
- Elle va prendre un tuyau via la pomme d’arrosage. (CrĂ©ation de l’observable)
- A l’autre bout du tuyau, nous avons une autre personne qui va ouvrir le robinet. (PrĂ©paration pour Ă©mission)
- DĂšs que celle qui tient la pomme d’arrosage dit que c’est ok, l’autre personne va ouvrir le tuyau. (Emission dans l’observable, et Souscription de celle qui va recevoir l’eau).
Rappel de la Promise
Souvent lorsque l’on veut Ă©viter le Hell Callback, et que l’on souhaite avoir une programmation asynchrone plus lisible, le rĂ©flexe que nous allons acquĂ©rir, du cĂŽtĂ© dĂ©veloppement web, c’est d’utiliser les Promises.
Pour rappel, les promises sont :
- Actives directement : lorsque l’on crĂ©e la Promise avec le code a exĂ©cutĂ©, il s’exĂ©cute directement
- Asychrones automatique : à savoir que le résultat récupéré dans le Then sera toujours exécuté aprÚs le thread courant.
- Si vous souhaitez un exemple bien parlant pour appréhender les Promises, je vous invite à découvrir celui imagé autour du snack de burger.
Une fois le résultat récupéré, vous allez pouvoir décider de le traiter et / ou de le ré-enchainer avec une autre promesse par exemple.
DiffĂ©rence avec l’Observable
L’Observable est par essence paresseuse ! Point intĂ©ressant pour de la programmation rĂ©active, n’est-ce pas ?
En somme, tant qu’il n’y a aucun observeur sur l’Observable, elle ne se dĂ©clenche, n’exĂ©cute aucune Ă©mission !
De plus, Ă la diffĂ©rence de la Promise, l’Observable est de base synchrone, elle ne s’Ă©xecute pas obligatoirement dans le Pool Event.
C’est notre code dans l’Observable qui va le dĂ©cider !
Je vous invite à lire cet article sur la différence entre Promise / Stream / Observable.
La puissance des Observables et .. sa faiblesse
Ce qui fait la force (et aussi sa faiblesse) de l’Observable, c’est qu’on va pouvoir aller beaucoup plus loin dans le traitement des donnĂ©es dans le tuyau (Stream).
Pour reprendre l’image du tuyau d’arrosage.
Et si la taille des gouttes d’eau ne vous convenait pas ? La couleur de chaque goutte d’eau n’Ă©tait pas la bonne ? Et tiens, et si vous souhaitiez ne prendre qu’une goutte d’eau sur deux ?
En Observable, c’est faisable ! L’utilisation d’operators, une fois appliquĂ©s dans le tuyau (pipe), vous permettre de transformer ce qui est Ă©mis depuis l’Observable !
Et voilĂ toute la puissance des Observables : vous allez pouvoir :
- combiner les operators pour prĂ©traiter les Ă©missions de l’Observable,
- combiner les observables entre elles
- ….
On vous en dit plus dans le prochain article, avec la découverte du pipe, et du tap !
Exemples de code
import { Observable } from 'rxjs';
const observable = new Observable(subscriber => {
subscriber.next(1);
subscriber.next(2);
subscriber.next(3);
setTimeout(() => {
subscriber.next(4);
subscriber.complete();
}, 1000);
});
console.log(‘just before subscribe’);
observable.subscribe({
next(x) { console.log(‘got value ‘ + x); },
error(err) { console.error(‘something wrong occurred: ‘ + err); },
complete() { console.log(‘done’); }
});
console.log(‘just after subscribe’);