2 votes

Effectuer une action lorsque http se résout et générer une erreur si nécessaire

Je tente de faire ce qui suit avec des observables et je ne parviens pas à trouver la meilleure façon de le faire :

Je fais appel à un point de terminaison de connexion en utilisant http. Ce service renverra un jeton. Je veux effectuer 2 actions différentes à partir de 2 points différents dans l'application de manière séquentielle : lorsque http résout, je dois stocker le jeton fourni, puis afficher un message. J'ai essayé ce qui suit :

return this.http.get(this.config.getApi('login'), params)
           .map(response => response.json())
           .do((data) => {
               // Stocker le jeton ici
               // En cas d'échec, renvoyer une erreur
               // J'ai essayé Observable.throw ici mais l'abonné ne le reçoit pas.
            }).subscribe(
               (data) => {
                  // Tout s'est bien passé
                },
               () => {
                  // Soit la requête http a échoué, soit
                 // le processus de stockage du jeton a généré une erreur.
            }
       );

Malheureusement, les abonnés à l'observable retourné ne reçoivent jamais d'erreur à moins que l'appel http échoue. Quel opérateur devrais-je utiliser à la place de do ?

Merci.

2voto

Aravind Points 21523

Vous devriez être abonné pour accéder à la réponse

this.http.get(this.config.getApi('login'), params)
                .map(response => response.json())
                .subscribe(data=>{
                     console.log(data);
       });

1voto

Jota.Toledo Points 11554

Peut-être quelque chose comme ça?

import { isDevMode } from '@angular/core';
import { _throw } from 'rxjs/observable/throw';

return this.http.get(this.config.getApi('login'), params)
.map(r => r.json())
.do(data => {
  this.token = data; //une variable d'instance définie dans votre classe de service
  if(isDevMode()) console.log(data) // afficher le journal uniquement en mode dev (pourquoi voudriez-vous enregistrer quelque chose dans la console en production ?! :D)
})
.catch(error => _throw(JSON.stringify(error));

Bien sûr, vous devez appeler cette méthode depuis l'extérieur (composant, garde, etc.) pour que la requête http soit exécutée

1voto

Vamshi Points 5473

De ce que je comprends, vous voulez faire ceci :

faire un appel http 
    puis faire quelque chose d'autre 
       si erreur   
           jeter erreur
    s'abonner 
        gérer le succès
        gérer l'erreur 

Une façon dont je peux penser pour faire cela, c'est d'utiliser un flatMap. Réécrire votre code

return this.http.get(this.config.getApi('login'), params)
       .map(response => response.json())
       .flatMap((data) => {
           //faire ce que vous voulez faire, 
           // disons erreur = vrai si quelque chose s'est mal passé
           return error ? 
               Observable.throw('message d'erreur') :
               Observable.of(data);
        }).subscribe(...);

Lien JSBIN avec une illustration simple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X