Use case of Observable .do() operator (rxjs)

35,410

Solution 1

Update

Now it's pipe( tap(...), ) instead of do()

Original

.do() is to execute code for each event. A difference to .map() is, that the return value of .do() is ignored and doesn't change what value the subscriber receives.

Solution 2

Now it's pipe( tap(...), ) instead of 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);
});

Output:

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

*Tap operator doesn't modify anything, you can say that it is just to view the stream.

Share:
35,410

Related videos on Youtube

soywod
Author by

soywod

Updated on February 27, 2020

Comments

  • soywod
    soywod about 4 years

     Context :

    I'm building an angular 2 app (with a Firebase API). I'm using the AngularFire module. I was wondering how I can mix the canActivate method with the AngularFire auth Observable, and I found this post. The answer is to make the canActivate method returns an Observable<boolean> :

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

    It's the first time I see the Observable do operator, and I can't understand what it really does ? The official doc didnt help me, and I didn't found decent examples.

    Question:

    Can someone bring here some examples of .do() usage ? And difference with .subscribe() ?

  • soywod
    soywod over 7 years
    OK I see, it's for doing some treatment without modify the stream. But I don't get why this work without a subscribe ? Does do do the same ? Can you give me some examples ? Thx for your reply anyway
  • JB Nizet
    JB Nizet over 7 years
    @Soywod There is a subscribe: just not in your code. The router subscribes to the observable returned by your guard, to know if it can activate or not.
  • codemonkey
    codemonkey over 6 years
    So am I correct in saying that the side effect in the do() call will get executed after the router Subscriber function ?
  • Günter Zöchbauer
    Günter Zöchbauer over 6 years
    @user2153465 router.navigate will be called when the observable returned by this.auth emits the first value.
  • Franki1986
    Franki1986 almost 5 years
    Can I use an observable wit do without sharing the observable?
  • Günter Zöchbauer
    Günter Zöchbauer almost 5 years
    @Franki1986 sure, but you need to subscribe() otherwise the executable won't do anything and also not call do(...).
  • Kiran Dash
    Kiran Dash over 4 years
    Hi @GünterZöchbauer. Is do operator still present in RxJS. I was going through the documentaion today and could not find it. If it is removed, is there any replacement for this operator.
  • Günter Zöchbauer
    Günter Zöchbauer over 4 years
    It's tap() now