Création d'un Observable
Il est rare de devoir créer un Observable
"from scratch" car Angular fournit généralement des "wrappers" à base d'Observable
s pour la plupart des sources de données asynchrones (http, forms, route changes etc...) mais il est intéressant de s'y aventurer au moins une fois pour mieux en comprendre le fonctionnement.
Observer
Observer
L'exemple suivant :
... produit le résultat :
Vous remarquerez quelques similitudes avec la création d'une Promise
.
Le duo de paramètres resolve
et reject
est remplacé par un objet Observer
disposant des méthodes next
, error
, complete
.
En omettant l'appel à la méthode complete
, nous produisons un Observable
infini et risquons des fuites mémoire si l'on oublie d'unsubscribe
.
Erreur
La méthode error
permet de déclencher une erreur.
Une fois les méthodes error
ou complete
appelées, les appels suivants aux méthodes next
, error
et complete
sont simplement ignorés.
"Teardown logic"
Voici un exemple d'implémentation de la fonction RxJS interval
utilisée précédemment.
Cela produit le résultat suivant :
5 secondes après la "subscription", la "callback" next
ne reçoit plus de valeurs. Par contre, NodeJS ne rend pas la main car le setInterval
continue à tourner (et émettre des valeurs ignorées) en tâche de fond malgré l'appel à unsubscribe
. Il s'agit d'une fuite.
Pour remédier à ce problème, il faudrait appeler la fonction clearInterval
dès que :
une erreur est détectée,
la méthode
complete
est appelée,le consommateur de l'
Observable
appelle la méthodeunsubscribe
.
Il faut donc implémenter une sorte de destructeur d'Observable
.
Ce destructeur est appelé "Teardown Logic" et doit être retourné par la fonction de subscribe
passé en paramètre au constructeur de l'Observable
.
Le problème est ainsi résolu car clearInterval
sera appelé peu importe l'origine de l'interruption : unsubscribe
, error
ou complete
.
Dernière mise à jour