【问题标题】:BehaviorSubject firing twiceBehaviorSubject 触发两次
【发布时间】:2021-03-12 22:45:33
【问题描述】:

我正在使用来自 RxJS 的 BehaviourSubject:

private rights = new BehaviorSubject<Array<string>>([]);


updateRights(rights: Array<string>) {
  this.rights.next(rights);
}

getRights(): Observable<any> {
  return this.rights.asObservable();
}

我正在更新根组件中的权限,并在另一个组件中订阅它,例如:

 this.configService.getRights().subscribe(res => {
   console.log(res);
 })

此订阅触发了两次。数据为空时一次,接收数据时再一次。

我希望订阅只触发一次并且只获取最新数据。应该怎么做?

【问题讨论】:

    标签: rxjs angular7


    【解决方案1】:

    BehaviourSubject 默认情况下会在订阅时发出值,这是有意设计的。如果您不想要这种行为,请改用Subject

    【讨论】:

    • 这是正确答案。在使用 rxjs 时,了解 Subject、BehaviorSubject 和 ReplaySubject 的区别非常重要(ReplaySubject 用的不多,通常你会使用 Subject 或 BehaviorSubject)。
    【解决方案2】:

    这样做:

    private currnetRightsSubject: BehaviorSubject<string[]>;
    public currentRights: Observable<string[]>;
    
    constructor() {
        this.currnetRightsSubject= new BehaviorSubject<string[]>(/*.......*/);
        this.currentRights= this.currnetRightsSubject.asObservable();
    }
    
    public get currentRightsValue(){
        return this.currnetRightsSubject.value;
    }
    

    更新

    像这样填写BehaviorSubject

    this.currnetRightsSubject.next(someValue);
    

    【讨论】:

    • “Observable”类型上不存在属性“值”
    • 试过了。现在它不等待 value.its 显示空数组
    • 你必须先把值放在behaviorSubject中,我更新答案
    • 检查我的问题..我在 updateRights 函数中这样做
    • 我从获取当前权限值函数中删除了 .value ..行为主体返回。问题是从中获取值 .value 不起作用
    猜你喜欢
    • 1970-01-01
    • 2020-03-15
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多