首页 > 解决方案 > 如何从服务中的另一个服务订阅 BehaviorSubject?

问题描述

我有 2 项服务:A 和 B 我在 A 中创建了一个 BehaviorSubject 并想在 B 中订阅它。

export class ServiceA{
   someAttribute: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
   otherAttribute: BehaviorSubject<boolean>;
   constructor(){
       otherAttribute = new BehaviorSubject<boolean>(false); 
   }
}
...
export class ServiceB{
   constructor(){
       someAttribute.subscribe(newValue =>{...}); 
       otherAttribute.subscribe(newValue =>{...}); 
   }
}

问题:

服务 B 只运行一次订阅。意思是构造函数完成后,订阅也完成了。

问题:

如何从服务中的另一个服务订阅 BehaviorSubject?

其他信息 我正在使用 Angular CLI,对 BehaviorSubjects 有点陌生。我想拆分 2 个服务的职责,但其中一个依赖于另一个,并且必须监听某些属性的变化。

我也无法进行循环依赖,这意味着服务依赖于 B (B->A) 和 B 依赖于 A (A->B)。我只希望 B 依赖于 A,以便 A 负责提供信息,B 听取他们的意见。

标签: angularrxjsangular-cli

解决方案


从您的伪代码看来,您已经从服务 B 中的服务 A 订阅了 BehaviorSubject。如果要发出新值,则需要调用.next

someBehaviorSubject.next(someValue)

此外,您可能需要考虑通过该asObservable方法将 Subject 公开为 Observable。直接公开一个主题是有潜在危险的,因为它允许消费者直接访问主题 API - 即他们可以调用.next和发出值。在您的情况下,这意味着服务 B 可以触发服务 A 发出。这可能是你想要的——在这种情况下没关系——但如果不是这样,不给消费者这个选项会更安全。就像是:

export class ServiceA{
    constructor() {
        this.foo = this._foo.asObservable();
    }

    private readonly _foo = new BehaviorSubject<boolean>(false);

    public readonly foo: Observable<boolean>;
}
...
export class ServiceB{
   constructor(private readonly _serviceA: ServiceA){
       this._serviceA.foo.subscribe(value => {
           ...
       }); 
   }
}

推荐阅读