Observable .do() 操作符 (rxjs) 的使用案例

46

背景:

我正在构建一个使用Firebase API的Angular 2应用程序。 我正在使用AngularFire模块。 我想知道如何将canActivate方法与AngularFire身份验证Observable混合使用,然后我找到了这篇文章。 答案是使canActivate方法返回一个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()的区别?

2个回答

72

更新

现在使用pipe(tap(...),)代替do()

原始内容

.do() 是为每个事件执行代码的方法。与 .map() 的区别在于,.do() 的返回值被忽略,不会改变订阅者接收到的值。


2
好的,我明白了,这是为了在不修改流的情况下进行一些处理。但我不明白为什么这可以在没有“subscribe”的情况下工作?do是否也可以实现相同的功能?你能给我一些例子吗?无论如何,感谢您的回复。 - soywod
8
@Soywod,有一个订阅功能:只是不在你的代码中。路由器订阅了由你的守卫返回的可观察对象,以了解是否可以激活。 - JB Nizet
1
this.auth 返回的可观察对象发出第一个值时,将调用 router.navigate - Günter Zöchbauer
1
@Franki1986 当然可以,但你需要先调用 subscribe() 方法,否则可执行文件不会有任何作用,也不会调用 do(...) 方法。 - Günter Zöchbauer
嗨@GünterZöchbauer。在RxJS中,do操作符是否仍然存在?我今天查看了文档,但没有找到它。如果已经删除,那么有没有替代这个操作符的方法? - Kiran Dash
显示剩余3条评论

8
现在使用 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操作符不会修改任何内容,可以说它只是用于查看流。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接