2017-01-31 7 views
1

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

, потому что эти строки:

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

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

2

вы получаете результат корректен:

this.val(); 

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

this.changeSt(true); 

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

this.val(); 

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

this.changeSt(false); 

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

this.val(); 

То же, что и выше.