【问题标题】:Use case of Observable .do() operator (rxjs)Observable .do() 运算符 (rxjs) 的用例
【发布时间】:2017-04-18 20:24:11
【问题描述】:

 上下文:

我正在构建一个 Angular 2 应用程序(使用 Firebase API)。我正在使用 AngularFire 模块。我想知道如何将canActivate 方法与AngularFire auth Observable 混合使用,我找到了this post。答案是让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()有什么区别?

【问题讨论】:

    标签: angular firebase rxjs observable angularfire2


    【解决方案1】:

    更新

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

    原创

    .do() 是为每个事件执行代码。与.map() 的不同之处在于,.do() 的返回值被忽略并且不会改变订阅者收到的值。

    【讨论】:

    • 好的,我明白了,这是为了在不修改流的情况下进行一些处理。但我不明白为什么没有 subscribe 可以工作? do 也这样做吗?你能给我一些例子吗?谢谢你的回复
    • @Soywod 有一个订阅:只是不在您的代码中。路由器订阅你的守卫返回的可观察对象,以了解它是否可以激活。
    • 那么我是否正确地说 do() 调用中的副作用将在路由器订阅者功能之后执行?
    • @user2153465 router.navigate 将在this.auth 返回的可观察对象发出第一个值时被调用。
    • @Franki1986 当然,但你需要subscribe() 否则可执行文件不会做任何事情,也不会调用do(...)
    【解决方案2】:

    现在是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 操作符不做任何修改,可以说只是为了查看流。

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2018-10-08
      • 2016-12-26
      • 2018-06-10
      • 2022-01-01
      • 2016-12-02
      • 1970-01-01
      • 2020-07-10
      相关资源
      最近更新 更多