Angular 用作PartialObserver的BehaviorSubject会中断对BehaviorSubject的订阅

Angular 用作PartialObserver的BehaviorSubject会中断对BehaviorSubject的订阅,angular,rxjs,observable,reactive-programming,Angular,Rxjs,Observable,Reactive Programming,我查看了Observable的接口,发现可以将任何实现PartialObserver的东西传递给subscribe函数。所以我用行为主体做了这件事 像这样(A) 所以我做了,但是发现了一些非常奇怪的事情。如果我将behavior subject传递给subscribe函数,则会发出值,但要看到这一点,必须在将behavior subject用作PartialObserver之前进行订阅 在行为主题的文档中,您可以找到: A variant of Subject that requires an

我查看了Observable的接口,发现可以将任何实现PartialObserver的东西传递给subscribe函数。所以我用行为主体做了这件事

像这样(A)

所以我做了,但是发现了一些非常奇怪的事情。如果我将behavior subject传递给subscribe函数,则会发出值,但要看到这一点,必须在将behavior subject用作PartialObserver之前进行订阅

在行为主题的文档中,您可以找到:

A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.
因此,当使用BehaviorSubject作为partialObserver时,此行为会中断。(无意使用双关语)

但当我使用这种方法时: 像这样(B)

一切正常

为什么方法A不起作用?这是一个bug还是我用错了

这里是stackblitz all设置的链接

titleX:表示方法A titleY:表示方法B


应该可以订阅BehaviorSubject。你订阅的时间应该无关紧要。否则,它不应该被允许作为subscribe方法的参数。

原因是当您这样做时

source$.subscribe(this._titlesX$)
您已经将源完全强制转换为BehaviorSubject,因为BehaviorSubject是一个完整的观察者,包括完整和错误处理程序<一次发射后,of的code>完成,因此它也完成了您的行为主体,而完成的主体不发射。但是仅仅在订阅源代码$中调用next显然不会通过完整/错误处理程序

如果您的来源更像:

const source$ = interval(1000).pipe(map(v => [v.toString()]));
在未完成的地方,您将看到预期的行为


blitz:

虽然我承认这是一个相当奇怪的行为,当订阅时,一个可观察对象应该重新发射它的最新发射,但我真的不明白为什么要将BehaviorSubject传递给subscribe函数。你只是在做实验,还是有什么特别的想法?@WillAlexander我总是这样做。对于想要缓存结果来说,它很方便。出于好奇,有什么理由把它放在
订阅
中,而不是放在
点击
或自定义操作符中?rxjs有很多多播操作符。如果你想将一个主题完全连接到另一个主题,那么将其放入subscribe是最简单的方法,因为它会自动传递onNext、onError和onComplete@WillAlexander我有一个httpClient响应。我画了一些东西。并将结果传递给行为主体。因此,我们可以访问下一个等等。关于第2个问题:我不希望我的观察结果有副作用。
source$.subscribe(this._titlesX$)
const source$ = interval(1000).pipe(map(v => [v.toString()]));