BehaviorSubject с логическим значением не работает должным образом

Я реализовал простой 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 ответа

Вывод, который вы получаете, правильный:

this.val();

Это просто делает первую подписку, которая ничего не печатает благодаря if (res) {...},

this.changeSt(true);

Установите значение в true который печатается по первой подписке.

this.val();

Делает вторую подписку, которая печатает вторую true,

this.changeSt(false);

Вы установили его на false который игнорируется всеми подписчиками из-за if (res) {...},

this.val();

Так же, как и выше.

Потому что эти строки:

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

значение только журнал, когда это действительно. Кстати, вы неправильно понимаете, как работает ваш код.

Другие вопросы по тегам