我有一个BehaviorSubject被观察为消耗:

testForStack$: Observable<boolean>;

ngOnInit(){
    const bs = new BehaviorSubject(true);
    this.testForStack$ = bs
      .asObservable()
      .do(t => console.log('subscribed'))
      .share();
}

该可观察对象通过模板中的三个异步管道进行管道传输:
Sub1: {{testForStack$ | async}}<br>
Sub2: {{testForStack$ | async}}<br>
Sub3: {{testForStack$ | async}}

问题是只有第一个(Sub1)获得true的值
Sub1: true
Sub2:
Sub3:

如果删除.share(),则所有三个值都将获得true值,但这会导致多个订阅问题。

关于为什么使用BehaviorSubject导致此行为的任何想法?它被用作观察对象,因此我假设上面的代码可以正常工作。

这也与此答案类似:

https://stackoverflow.com/a/40819423/4912604

最佳答案

这是正确的行为。 share()运算符仅保留对其父项的一个订阅,而BehaviorSubject仅在订阅时发出其值。

这意味着,当您使用第一个{{testForStack$ | async}}时,它会在链的末尾订阅share(),而BehaviorSubject会订阅其父项,这导致订阅了立即发出其值的源{{testForStack$ | async}}

但是,第二个和所有连续的share()都订阅了shareReplay(1),而publishReplay(1).refCount()已经订阅了它的父级,并且不再进行任何订阅,因此没有什么可将源值推送给这些观察者。

一个简单的解决方案可能是使用ojit_code(取决于您的RxJS版本),由于这些问题(或它的可等效点),您可能应该使用ojit_code代替:

  • https://github.com/ReactiveX/rxjs/issues/3336
  • https://github.com/ReactiveX/rxjs/issues/3127
  • 关于angular - 带有行为主题和异步管道的Rxjs share()运算符-Angular,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52742855/

    10-12 07:37