Skip to main content

Command Palette

Search for a command to run...

Arrêtons d’utiliser le pipe `async`, pourquoi ?

Updated
2 min read
Arrêtons d’utiliser le pipe  `async`, pourquoi ?
E

Je suis Ezéchiel Amen AGBLA, Angular Developer Expert & Ionic Developer Expert, passionné par le développement web et mobile. Je mets la lumière sur des notions liées à Angular et à Ionic pour la communauté francophone.

Dans vos applications Angular, vous avez certainement l'habitude d'utiliser le pipe async pour souscrire à un Observable afin de récupérer les données émises. Ce pipe, dans sa particularité permet aussi de détruire cet Observable de façon implicite dès que la souscription est complète.

Prenons cet exemple de code :

<ul>
     <li *ngFor="let number of numbers$ | async">
        {{ number }}
    </li>
</ul>

Que se passera t-il, lorsque la souscription à l'Observable retournera une erreur ? Rien ! On ne peut pas signaler à l'utilisateur qu'il y a un problème par exemple 😱
On fait face à un souci d'expérience utilisateur😫

Lorsque l'Observable retourne une erreur, rien ne se passe du côté du pipe async. Il n'y a pas un moyen de traiter l'erreur. C'est dérangeant car l'on aimerait quand même afficher un message d'erreur au niveau de notre template afin d'avoir une bonne expérience utilisateur.

Pas de panique ! Une solution existe 😁
Levons nos verres 🥂 à la directive
*ngrxLet de la bibliothèque @ngrx/component.

En effet, la directive *ngrxLet, en plus de ce que le pipe async permet de faire déjà, récupère les trois (03) évènements liés à la souscription d'un Observable à savoir :

  • next

  • error

  • complete

Examinons ce code :

<ng-container *ngrxLet="number$ as n; error as e; complete as c">
  <app-number [number]="n" *ngIf="!e && !c">
  </app-number>

  <p *ngIf="e">There is an error: {{ e }}</p>
  <p *ngIf="c">Observable is completed.</p>
</ng-container>
  • numbers$ est un Observable. Lorsqu'on souscrit à ce dernier au niveau de la classe TS, voici ce à quoi on devrait s'attendre :
number$.subscribe({
 next: x => console.log(x),
 error: err => console.error(err),
 complete: () => console.log('Observer got a complete notification')
});

En comparaison avec le code HTML précédent, on a :

  • number$ as n => next

  • error as e => error

  • complete as c => complete

Pour rajouter cette directive à votre projet, voici comment procéder :

  1. Installer le package @ngrx/component :

     ng add @ngrx/component@latest
    
  2. Ajouter le module LetModule dans le module de votre composant :

     import { LetModule } from '@ngrx/component';
    
     imports: [
         // ... other imports
         LetModule,
       ],
    

En somme, pour améliorer l'expérience utilisateur de vos applications tout en écrivant moins de code au niveau de votre classe TS, vous savez quoi faire à présent !

Pour plus d'informations 👉 NgRx - Let Directive

S

Très intéressant cet article, j'apprends énormément à travers vos articles. Vivement que ça continue 🙏🏽😊

J

Intéressant comme article. Perso, je ne connaissais pas cette directive, mais ça me sera utile.

1
E

Merci pour ton feedback 😃 Ça fait plaisir !

1

More from this blog

A

angulardev.fr

25 posts

Je suis Ezéchiel Amen AGBLA, Angular Developer Expert & Ionic Developer Expert, passionné par le développement web et mobile.