【发布时间】:2019-08-14 17:04:50
【问题描述】:
我查看了 observables 的接口,发现您可以将任何实现 PartialObserver 的东西传递给 subscribe 函数。所以我用 BehaviorSubject 做到了。
像这样 (A)
source$
.pipe(
tap(() => console.log('X')),
)
.subscribe(this._titlesX$);
所以我做了,但发现了一些非常奇怪的东西。如果我将行为主题传递给订阅函数,则会发出值,但要看到这一点,您必须在将 BehaviorSubject 用作 PartialObserver 之前进行订阅。
在 BehaviorSubject 的文档中,您可以找到:
A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.
所以当使用 BehaviorSubject 作为 partialObserver 时,这种行为会中断。(没有双关语)
但是当我使用这种方法时: 像这样(B)
source$
.pipe(
tap(() => console.log('X')),
)
.subscribe(res => this._titlesX$(res));
一切都按预期进行。
为什么方法 A 不起作用?这是一个错误还是我只是用错了?
这里是 stackblitz all setup 的链接。 Link to stackblitz project
titleX:代表方法A titleY:代表方法B
应该可以使用 BehaviorSubject 订阅。您订阅的时间并不重要。否则它不应该被允许作为订阅方法的参数。
【问题讨论】:
-
虽然我承认这是来自 Observable 的相当奇怪的行为,它应该在订阅时重新发出其最新的发射,但我真的不明白你为什么要将 BehaviorSubject 传递给 subscribe 函数。您只是在尝试还是有什么具体的想法?
-
@WillAlexander 我一直这样做。想要缓存结果很方便。
-
出于好奇,有什么理由将其放入
subscribe而不是tap或自定义运算符中? -
rxjs 有很多多播操作符。将其放入 subscribe 是最直接的方法,但如果您想将一个主题完全连接到另一个主题,因为它会自动传递 onNext、onError 和 onComplete
-
@WillAlexander 我有一个 httpClient 响应。我映射了一些东西。并将结果传递给 BehaviorSubject。所以我们可以访问关于 2q 的下一个等:我不希望我的 observables 有副作用。
标签: angular rxjs observable reactive-programming