我查看了可观察到的接口,并看到您可以将实现PartialObserver的任何东西传递给订阅函数。所以我用BehaviorSubject做了这个。
像这样(A)
source$
.pipe(
tap(() => console.log('X')),
)
.subscribe(this._titlesX$);所以我做了,但发现了一些很奇怪的事情。如果我将服从订阅函数的行为传递给订阅函数,则会发出值,但要看到这一点,您必须在使用BehaviorSubject作为PartialObserver之前进行订阅。
在BehaviorSubject的docs中,您可以找到以下内容:
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所有设置的链接。链接到stackblitz项目
titleX:表示方法A titleY:表示方法B
订阅BehaviorSubject应该是可能的。你订阅的时间应该不重要。否则,不应该允许它作为订阅方法的参数。
发布于 2019-08-14 18:26:59
因为当你这么做的时候
source$.subscribe(this._titlesX$)您已经将源代码完全传递给BehaviorSubject,因为BehaviorSubject是一个完整的观察者,包括完整的和错误的处理程序。of在一次发射之后就完成了,所以它也完成了您的BehaviorSubject,并且完成的主题不会发出。但是,仅在源代码$的订阅中调用next显然不会通过完整/错误处理程序。
如果你的线人更像是:
const source$ = interval(1000).pipe(map(v => [v.toString()]));如果它没有完成,您将看到预期的行为。
闪电战https://stackblitz.com/edit/angular-gfmdgf?file=src/app/app.component.ts
https://stackoverflow.com/questions/57499116
复制相似问题