用作PartialObserver的BehaviorSubject中断了BehaviorSubject

时间:2019-08-14 17:04:50

标签: angular rxjs observable reactive-programming

我一直在观察observables的接口,发现可以将实现PartialObserver的任何东西传递给订阅函数。所以我用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所有设置的链接。 Link to stackblitz project

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

使用BehaviorSubject进行订阅应该是可能的。订阅时间不重要。否则,不应将其作为订阅方法的参数。

1 个答案:

答案 0 :(得分:2)

原因是因为当您这样做

source$.subscribe(this._titlesX$)

您已将源完全转换为BehaviorSubject,因为BehaviorSubject是完整的观察者,包括完整和错误处理程序。 of在一次发射后完成,因此也会完成您的BehaviorSubject,并且完成的主题不会发射。但是仅在source $的订阅中调用next显然不会通过complete / error处理程序。

如果您的来源更像:

const source$ = interval(1000).pipe(map(v => [v.toString()]));

未完成的地方,您将看到预期的行为。

闪电战:https://stackblitz.com/edit/angular-gfmdgf?file=src/app/app.component.ts