如何从服务中的其他服务订阅BehaviorSubject?

时间:2019-08-12 11:48:56

标签: angular rxjs angular-cli

我有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)和A上的B(A-> B)。我只希望B依赖于A,以便A负责提供信息,而B则监听它们。

1 个答案:

答案 0 :(得分:0)

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

someBehaviorSubject.next(someValue)

另外,您可能需要考虑通过asObservable方法将Subject作为可观察对象公开。在执行操作时直接公开主题可能会很危险,因为它允许消费者直接访问主题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 => {
           ...
       }); 
   }
}