Ama*_*taj 4 reactive-programming observable rxjs angular
我正在查看可观察对象的接口,发现您可以将任何实现 PartialObserver 的内容传递给订阅函数。所以我用BehaviorSubject 做到了这一点。
像这样(A)
source$
.pipe(
tap(() => console.log('X')),
)
.subscribe(this._titlesX$);
Run Code Online (Sandbox Code Playgroud)
于是我就这么做了,但发现了一些很奇怪的事情。如果我将行为传递给订阅函数,则会发出值,但要看到这一点,您必须在使用BehaviorSubject 作为 PartialObserver 之前进行订阅。
在BehaviorSubject 的文档中,您可以找到以下内容:
A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.
Run Code Online (Sandbox Code Playgroud)
因此,当使用BehaviorSubject作为partialObserver时,这种行为就会中断。(没有双关语)
但是当我使用这种方法时:像这样(B)
source$
.pipe(
tap(() => console.log('X')),
)
.subscribe(res => this._titlesX$(res));
Run Code Online (Sandbox Code Playgroud)
一切都按预期进行。
为什么方法A不起作用?这是一个错误还是我只是使用错误?
这是 stackblitz 所有设置的链接。链接到 stackblitz 项目
titleX:代表方法A titleY:代表方法B
使用BehaviorSubject 进行订阅应该是可能的。您订阅的时间并不重要。否则,不应允许它作为 subscribe 方法的参数。
原因是因为当你这样做时
source$.subscribe(this._titlesX$)
Run Code Online (Sandbox Code Playgroud)
您已将源完全转换为BehaviorSubject,因为BehaviorSubject 是一个完整的观察者,包括完整和错误处理程序。 of在一次发射后完成,因此它也完成了您的BehaviorSubject,并且完成的主题不会发射。但仅仅在 source$ 的订阅中调用 next 显然不会通过完整/错误处理程序。
如果你的来源更像是:
const source$ = interval(1000).pipe(map(v => [v.toString()]));
Run Code Online (Sandbox Code Playgroud)
如果它未完成,您将看到预期的行为。
闪电战:https://stackblitz.com/edit/angular-gfmdgf?file=src/ app/app.component.ts
| 归档时间: |
|
| 查看次数: |
1310 次 |
| 最近记录: |