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) 的用例的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift 在 Zip 运算符中处理 observable