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

Mar*_*rty 6 javascript rxjs subject-observer behaviorsubject angular

我实现了一个简单的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();
  }


}
Run Code Online (Sandbox Code Playgroud)

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

true
true
Run Code Online (Sandbox Code Playgroud)

虽然我期待价值

false
true
false
Run Code Online (Sandbox Code Playgroud)

我的实施有什么问题?

mar*_*tin 5

你得到的输出是正确的:

this.val();
Run Code Online (Sandbox Code Playgroud)

这只是第一次订阅,由于没有打印任何东西if (res) {...}.

this.changeSt(true);
Run Code Online (Sandbox Code Playgroud)

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

this.val();
Run Code Online (Sandbox Code Playgroud)

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

this.changeSt(false);
Run Code Online (Sandbox Code Playgroud)

您将其设置false为由所有订户忽略的因素if (res) {...}.

this.val();
Run Code Online (Sandbox Code Playgroud)

与上述相同.


Tie*_*han 2

因为这些行:

if (res){
  console.log(res);
}
Run Code Online (Sandbox Code Playgroud)

该值只有在为真时才会被记录。

顺便说一句,您误解了代码的工作方式。