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

标签 angular rxjs behaviorsubject

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

相关文章:

javascript - RxJS 检测长时间运行的订阅

angular - RXJS 获取 ReplaySubject 的当前值

angular - 组件销毁并重新访问后,订阅在 ngOnInit 函数中运行

angular - 给 BehaviorSubject 初始值 - 值是一个 Observable

angular - 检查对象在 Angular 2 中是否为空或未定义

angular - 捕获错误并返回 of(undefined) 会停止流(Angular 7,rxjs6)

javascript - 如何从输入文本中删除底线

javascript - 如何发出每个第 n 个值?

Angular2 Jasmine 模拟服务未使用,但实际服务被调用

javascript - 异步/等待失败的 Angular promise