Observable .do() 运算符的用例 (rxjs)

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

上下文:

我正在构建一个 angular 2 应用程序(使用 Firebase API)。我正在使用 AngularFire 模块。我想知道如何将 canActivate 方法与 AngularFire auth Observable 混合使用,我发现了 this post。答案是使 canActivate 方法 returns 成为 Observable<boolean> :

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

我第一次看到 Observable do 运算符,我不明白它到底做了什么?官方文档没有帮助我,我也没有找到像样的例子。

问题:

有人可以提供一些 .do() 用法的例子吗?与 .subscribe() 的区别 ?

更新

现在是 pipe( tap(...), ) 而不是 do()

原创

.do()是对每个事件执行代码。与 .map() 的区别在于,.do() 的 return 值被忽略,并且不会更改订阅者收到的值。

现在是 pipe( tap(...), ) 而不是 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);
});

输出:

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算子不修改任何东西,可以说只是为了看流