Je suis en train de construire une architecture sur la dernière version d'Angular 6 et, venant d'AngularJS, il y a quelque chose que je n'arrive pas à accepter : le traitement de base d'une requête HTTP.
Donc, pour les besoins de la question, disons que je veux un observable. Parce que cela semble être l'avenir d'Angular.
Je suis passé de quelque chose de très élégant, en AngularJS :
service.getAll()
.then(onSuccess) // I process the data
.catch(onError) // I do whatever needed to notify anyone about the issue
.finally(onFinally); // I stop the loading spinner and other stuff
Maintenant, dans Angular 6/RxJS 6, je ne comprends pas pourquoi tout est si compliqué et ne semble pas correct.
Je pourrais trouver deux façons de faire la même chose que ci-dessus :
-
Le tuyau plein
this.service.getAll() .pipe( map((data) => this.onSuccess(data)), catchError(error => of(this.handleError(error))), finalize(() => this.stopLoading()) ) .subscribe();
Puisque nous devons utiliser pipe pour le finalize, je pourrais aussi bien utiliser pipe pour tout, je pense que c'est une meilleure pratique d'avoir tout dans le même ordre. Mais maintenant nous devons lancer quelque chose, appelé "of" (pas très facile à comprendre) et je n'aime pas ça.
-
Le demi-tube J'essaie donc une autre idée, avec seulement le tuyau dont j'ai besoin (finalize) et je garde les callbacks d'abonnement.
this.service.getAll() .pipe( finalize(() => this.stopLoading()) ) .subscribe( (data) => this.onSuccess(data), (error) => this.handleError(error) );
Mais, bon. N'est-ce pas un peu arriéré ? Nous avons toujours des callbacks sans noms réels, et nous finalisons avant de lire le traitement et l'erreur. Bizarre.
Il y a donc quelque chose que je ne comprends absolument pas. Et je ne trouve rien en ligne sur cette question fondamentale. Soit vous avez quelqu'un qui veut "succès et enfin", soit "succès et erreur" mais personne ne veut les 3. Peut-être suis-je trop vieux et ne comprends-je pas la nouvelle meilleure pratique à ce sujet (si c'est le cas, éduquez-moi !).
Mon besoin est simple :
1. Je veux traiter les données que je reçois d'un service
2. Je veux obtenir l'erreur afin de l'afficher à l'utilisateur.
3. Je veux arrêter le spinner de chargement que je viens de lancer avant l'appel, ou faire un autre appel une fois que le premier est terminé en cas de succès ou d'erreur (je veux vraiment un finally).
Comment gérer votre appel HTTP de base avec observable ?
(Je ne veux pas de .toPromise
s'il vous plaît, je veux comprendre comment faire avec les nouvelles choses).