gpt4 book ai didi

angular - 具有 BehaviorSubject 和异步管道的 RxJS share() 运算符 - Angular

转载 作者:太空狗 更新时间:2023-10-29 17:49:17 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com