You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
L'`Observable` déclenche 3 notifications next suivies d'une notification complete. Un Observable arrête d'émettre des valeurs parce qu'elles sont erronées (callback error) ou parce qu'elles se terminent (callback complete). Les deux événements s'excluent mutuellement.
Semblable à la fonction bien connue `Array.prototype.map`, l'opérateur `map` ([marble](https://rxmarbles.com/#map) / [documentation](https://rxjs.dev/api/operators/map)) applique une projection à chaque valeur et émet cette projection dans l'`Observable` de sortie.
78
78
79
79
Transformons l'exemple précédent concernant l'événement click sur le document pour qu'il imprime les coordonnées du clic :
`pipe()` est une fonction utilisée pour composer des opérateurs tels que `map()`, `filter()`, `take()`... Les opérateurs sont appliqués au flux dans l'ordre où ils sont passés à la fonction pipe
@@ -144,12 +144,12 @@ Les flux peuvent être composés à de nombreuses fins. Pour étudier cette noti
144
144
145
145
Il est assez courant de devoir enchaîner les appels backend. Par exemple, l'utilisateur vient de modifier une ressource et vous souhaitez que votre page affiche ses détails mis à jour. Certains backends renvoient les détails de la ressource mise à jour dans le corps de la réponse à l'appel d'édition. Cependant, certains renvoient simplement une réponse HTTP 200 ou 204 sans corps. Cela signifie que l'appel de modification et l'appel de détail doivent être chaînés pour mettre à jour l'interface utilisateur. RxJS fournit plusieurs opérateurs pour enchaîner les événements de manière déclarative. Nous utiliserons l'opérateur `switchMap` ([documentation](https://rxjs.dev/api/operators/switchMap) / [marble](https://rxmarbles.com/#switchMap)) dans ce cas. Vous pouvez l'essayer dans le Stackblitz ci-dessous (cliquez n'importe où sur l'aperçu et voyez ce qu'il se passe dans la console, cliquez à nouveau et voyez comment les choses changent dans la console).
Un autre opérateur utile pour combiner les appels est `exhaustMap` ([documentation](https://rxjs.dev/api/operators/exhaustMap)). Alors que `switchMap` annule l'abonnement à l'Observable projeté précédent, exhaustMap ignore les nouveaux événements tant que l'Observable projeté précédent n'est pas terminé.
155
155
@@ -163,7 +163,7 @@ Pourquoi ne pas les mélanger ?
163
163
Le plus souvent, on le fait sans s'en rendre compte. Par exemple, dans la callback next d'un subscribe, vous appelez une méthode qui a un subscribe. C'est de l'imbrication de subscribes.
@@ -173,34 +173,26 @@ Pour le moment nous avons vu comment subscribe à un Observable. Pour éviter le
173
173
Réutilisons notre exemple de routage précédent pour illustrer comment les fuites mémoire peuvent se produire. Un Observable interval est créé dans la méthode ngOnInit du composant de détails du livre.
174
174
**Accédez aux détails d'un livre et regardez la console. Puis quittez la page et revenez. Que se passe-t-il dans la console ? Qu'est-ce que ça veut dire ?**
Quand unsubscribe ? Si vous n'avez aucune certitude que l'`Observable` s'achèvera ou qu'il produira une erreur, vous devez unsubscribe manuellement. Le `HttpClient` complète toujours l'Observable qu'il renvoie après avoir reçu une réponse. Donc, théoriquement, si vous ne rencontrez que des Observables du `HttpClient`, vous n'avez pas à unsubscribe. Dans les autres cas, **soyez prudent et unsubscribe**.
179
179
180
-
Comment unsubscribe ? Il y a deux manières :
181
-
- La méthode `subscribe` renvoie un objet `Subscription` qui dont la mémoire peut être désallouée en appelant la méthode unsubscribe sur celui-ci lorsque vous le souhaitez, généralement lorsque le composant dans lequel il réside est détruit.
182
-
- En utilisant l'opérateur `takeUntil` ([marble](https://rxmarbles.com/#takeUntil) / [documentation](https://rxjs.dev/api/operators/takeUntil)) et un [`Subject`](https://rxjs.dev/guide/subject) qui est un type spécial d'`Observable` sur lequel il est possible d'appeler les méthodes next(), error() et complete().
180
+
Comment unsubscribe ? En utilisant l'opérateur `takeUntilDestroyed` et en lui passant un `destroyRef`.
183
181
184
-
La deuxième méthode est plus facile à maintenir lorsque votre base de code grandit, c'est donc celle que vous devriez privilégier.
182
+
Corrigons la fuite de mémoire de l'exemple précédent.
185
183
186
-
Corrigons la fuite de mémoire de l'exemple précédent. Pour illustrer les deux techniques, l'Observable interval a également été ajouté au composant des détails de l'auteur :
Invoquer la méthode subscribe sur un `Observable` et enregistrer la valeur dans une propriété du composant n'est pas le seul moyen d'afficher les valeurs de l'`Observable`. Angular fournit un pipe auquel l'`Observable` peut être transmis directement.
188
+
Invoquer la méthode subscribe sur un `Observable` et enregistrer la valeur dans une propriété du composant n'est pas le seul moyen d'afficher les valeurs de l'`Observable`. Angular fournit un pipe à appliquer directement sur un `Observable`.
193
189
194
190
<CodeGroup>
195
191
<CodeGroupItemtitle="Component class">
196
192
197
193
```ts
198
194
exportclassAppComponent {
199
-
counter:Observable<number>
200
-
201
-
ngOnInit():void {
202
-
this.counter=interval(1000)
203
-
}
195
+
counter:Observable<number> =interval(1000)
204
196
}
205
197
```
206
198
</CodeGroupItem>
@@ -213,40 +205,50 @@ export class AppComponent {
213
205
</CodeGroupItem>
214
206
</CodeGroup>
215
207
216
-
Pour les objets, une syntaxe alternative existe pour éviter d'utiliser de manière répétitive le pipe async pour accéder à chaque champ :
208
+
Pour les objets, une syntaxe alternative existe pour éviter d'utiliser de manière répétitive le pipe async pour accéder à chaque champ. Sachant que chaque pipe `async` crée une souscription et trigger de nouveau l'exécution de l'`Observable`, c'est à éviter :
0 commit comments