我有一个 BehaviorSubject
作为可观察对象使用:
testForStack$: Observable<boolean>;
ngOnInit(){
const bs = new BehaviorSubject(true);
this.testForStack$ = bs
.asObservable()
.do(t => console.log('subscribed'))
.share();
}
这个 observable 正在通过模板中的三个 async
管道传输:
Sub1: {{testForStack$ | async}}<br>
Sub2: {{testForStack$ | async}}<br>
Sub3: {{testForStack$ | async}}
问题只是第一个 (Sub1
) 正在获取 true 的值
Sub1: true
Sub2:
Sub3:
如果我删除 .share()
,所有三个值都将获得 true 值,但这会导致多个订阅的问题。
关于为什么使用 BehaviorSubject 会导致此行为的任何想法?它被用作可观察对象,所以我假设上面的代码可以正常工作。
这类似于answer
最佳答案
这是正确的行为。 share()
运算符只保留对其父级的一个订阅,BehaviorSubject
仅在订阅时发出其值。
这意味着当您使用第一个 {{testForStack$ | async}}
它在链的末尾订阅 share()
订阅它的父级,这导致订阅源 BehaviorSubject
发出它的值立即。
但是,第二个和所有连续的 {{testForStack$ | async}}
订阅 share()
,它已经订阅了它的父级并且不会再进行订阅,所以没有什么可以将源值推送给这些观察者。
一个简单的解决方案可能是使用 shareReplay(1)
(取决于你的 RxJS 版本)你应该使用 publishReplay(1).refCount()
而不是因为这些问题(或其管道等价物):
关于angular - 具有 BehaviorSubject 和异步管道的 RxJS share() 运算符 - Angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52742855/