具有布尔值的BehaviorSubject未按预期工作

时间:2017-01-31 07:08:42

标签: javascript angular rxjs behaviorsubject subject-observer

我实施了一个简单的BehaviorSubject

import {BehaviorSubject} from "rxjs";

class MyWeirdoClass {

  constructor() {}


  private st: Subject<boolean> = new BehaviorSubject<boolean>(null);


  changeSt(val:boolean){
    this.st.next(val);
  }


  val(){
    this.st.subscribe(res=>{
      if (res){
        console.log(res);
      }
    })
  }

  stStatus() {
    this.val();
    this.changeSt(true);
    this.val();
    this.changeSt(false);
    this.val();
  }


}

现在,当运行stStatus()时,会在控制台上记录以下输出。

true
true

虽然我期待值

false
true
false

我的实施有什么问题?

2 个答案:

答案 0 :(得分:5)

您获得的输出是正确的:

this.val();

由于if (res) {...},这只会使第一个订阅无法打印任何内容。

this.changeSt(true);

将第一个订阅打印的值设置为true

this.val();

使第二个订阅打印第二个true

this.changeSt(false);

您将其设置为false由于if (res) {...}而被所有订阅者忽略。

this.val();

与上述相同。

答案 1 :(得分:2)

因为这些行:

if (res){
  console.log(res);
}

只有在真实的情况下才会记录该值。

不过,你误解了代码的工作方式。