带有行为主题和异步管道的Rxjs share()运算符-Angular

Ton*_*alo 4 rxjs angular

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

testForStack$: Observable<boolean>;

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

该可观察对象通过模板中的三个异步管道进行管道传输:

Sub1: {{testForStack$ | async}}<br>
Sub2: {{testForStack$ | async}}<br>
Sub3: {{testForStack$ | async}}
Run Code Online (Sandbox Code Playgroud)

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

Sub1: true
Sub2: 
Sub3:
Run Code Online (Sandbox Code Playgroud)

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

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

这也与此答案类似:

/sf/answers/2857359641/

mar*_*tin 5

这是正确的行为。该share()运营商只保留一个订阅到其父,并BehaviorSubject发出只认购其价值。

这意味着,当您使用第一个时,{{testForStack$ | async}}它会在链的末尾进行预订,而该链的末尾share()会订阅其父项,这会导致订阅BehaviorSubject立即产生其价值的来源。

但是,第二个和所有连续的{{testForStack$ | async}}订阅share()已经订阅了它的父订阅,并且不再进行订阅,因此没有什么可以将源值推送给这些观察者。

一个简单的解决方案可能是使用shareReplay(1)(取决于您的RxJS版本),publishReplay(1).refCount()因为这些问题(或它的可等效等价物),您可能应该改用它: