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

soy*_*wod 36 observable rxjs firebase angularfire2 angular

 背景:

我正在构建一个角度2应用程序(使用Firebase API).我正在使用AngularFire模块.我想知道如何将canActivate方法与AngularFire auth Observable混合,我发现了这篇文章.答案是让canActivate方法返回一个Observable<boolean>:

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

这是我第一次看到Observable do操作符,我无法理解它的真正含义?官方文件没有帮助我,我没有找到合适的例子.

题:

有人可以带一些.do()使用示例吗?与.subscribe()?有区别?

Gün*_*uer 55

pipe( tap(...), )是为每个事件执行代码.不同之处do()在于,返回值.do()被忽略,并且不会改变订户接收的值.

  • @Soywod有一个订阅:只是不在您的代码中.路由器订阅你的守卫返回的观察者,知道它是否可以激活. (8认同)
  • 好的,我知道,这是为了在不修改流的情况下进行一些处理.但是我不明白为什么这个工作没有`订阅'?"做"是否也这样做?你能举个例子吗?无论如何,谢谢你的回复 (2认同)

Muh*_*lal 6

现在它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);
});
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

*Tap 操作符不做任何修改,可以说只是为了查看流。