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

Posted

技术标签:

【中文标题】Observable .do() 运算符 (rxjs) 的用例【英文标题】:Use case of Observable .do() operator (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()有什么区别?

【问题讨论】:

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

【讨论】:

以上是关于Observable .do() 运算符 (rxjs) 的用例的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 observable 我如何提取响应?

RxSwift 在 Zip 运算符中处理 observable

错误 TS2339: 类型 'Observable<HttpEvent<any> 上不存在属性 'do'

rxjs简单入门

text RxJ使运营商扁平化

Rxjs 过滤器运算符不适用于 Angular2 Observable