46 votes

Cas d'utilisation de l'opérateur Observable .do() (rxjs)

 Contexte :

Je suis en train de construire une application angulaire 2 (avec une API Firebase). J'utilise le module AngularFire. Je me demandais comment je peux mélanger le module canActivate avec l'Observable d'authentification AngularFire, et j'ai trouvé ce poste . La réponse est de rendre le canActivate renvoie un Observable<boolean> :

canActivate(): Observable<boolean> {
  return this.auth
    .take(1)
    .map((authState: FirebaseAuthState) => !!authState)
    .do(authenticated => {
      if (!authenticated) this.router.navigate(['/login']);
    });
}

C'est la première fois que je vois l'Observable do et je n'arrive pas à comprendre ce qu'il fait vraiment ? La documentation officielle ne m'a pas aidé, et je n'ai pas trouvé d'exemples décents.

Question :

Quelqu'un peut-il apporter ici des exemples de .do() usage ? Et la différence avec .subscribe() ?

72voto

Günter Zöchbauer Points 21340

Mise à jour

Maintenant, c'est pipe( tap(...), ) au lieu de do()

Original

.do() est d'exécuter du code pour chaque événement. Une différence avec .map() est que la valeur de retour de .do() est ignorée et ne change pas la valeur que l'abonné reçoit.

2 votes

OK je vois, c'est pour faire un traitement sans modifier le flux. Mais je ne comprends pas pourquoi cela fonctionne sans un fichier subscribe ? Est-ce que do faire la même chose ? Pouvez-vous me donner quelques exemples ? Merci pour votre réponse en tout cas

8 votes

@Soywod Il y a un subscribe : mais pas dans votre code. Le routeur s'abonne à l'observable retourné par votre garde, pour savoir s'il peut s'activer ou non.

0 votes

Ai-je raison de dire que l'effet secondaire dans l'appel do() sera exécuté après la fonction d'abonné du routeur ?

8voto

Muhammad Bilal Points 14

Maintenant, c'est pipe( tap(...), ) au lieu de do()

const source = of(1, 2, 3, 4);
source.pipe(
  tap(val => console.log('I am tap: ',val)),
  filter(val =>  val > 2),
  map(val => val + 1)).subscribe((val) => {
  console.log('I am subscriber value after filtering: ', val);
});

Sortie :

I am tap:  1
I am tap:  2
I am tap:  3
I am subscriber value after filtering:  4
I am tap:  4
I am subscriber value after filtering:  5

*L'opérateur de tapotement ne modifie rien, on peut dire que c'est juste pour voir le flux.

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