Получить значение BehaviorSubject - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь получить значения BehaviorSubject. Значения возвращаются, но как их использовать, чтобы использовать их в выражении true / false.

BehaviorSubject {_isScalar: false, observers: Array(0), closed: false, isStopped: false, hasError: false, …}
closed:false
hasError:false
isStopped:false
observers:[Subscriber]
thrownError:null
value:(...)
_isScalar:false
_value:Array(3)
0:"name@gmail.com"
1:"Bob Smith"
2:{adminUser: false, basicUser: true} length:3
__proto__:Array(0)
__proto__:Subject

Моему субъекту поведения отправляется следующее. Почему я получаю ноль в начале.

user: BehaviorSubject<User> = new BehaviorSubject<User>(null); 

// Роли поведения пользователя.

 this.afAuth.authState
                .switchMap(auth => {
                if (auth) {
                    /// signed in
                    const authData = this.db.list<User>('users/' + auth.uid).valueChanges();
                    console.log(authData);
                    return this.db.list<User>('users/' + auth.uid).valueChanges();
                } else {
                    /// not signed in
                    return Observable.of(null);
                }
                })
                // .subscribe(console.log); // check the subscription
                .subscribe((userData) => {
                console.log(userData);
                this.user.next(userData);
                // this.user.next(user);
                // console.log(this.user.next(userData));
                });
            }

Результаты, с которыми у меня возникли проблемы:

Check Value false authguard.service.ts:39 
Route was False authguard.service.ts:26 
Check Value true

Я запускаю console.log, и значение сначала отображается как null, поэтому имеет ложный ответ. Затем он снова запускается и становится правдой. Все это происходит после запуска страницы изначально. Мне нужно, чтобы мои значения проверки были истинны при загрузке.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Я официально ответил на мой вопрос.Может быть, это не правильный путь, но это действительно сработало. BehaviorSubject из rxjs создает как начальное, так и текущее значение в этот конкретный период времени.Теперь, если вы хотите обойти начальное значение (которое в моем случае было null ), то прежде чем подписаться на него, обязательно используйте оператор пропуска .Который я использовал в этом случае, чтобы пропустить первое значение skip (1).

0 голосов
/ 26 июля 2019

У меня такая же проблема. Я всегда получаю свое начальное значение (которое является нулевым) и никогда не выбрасываемые значения. skip() -метод не помог мне, но skipWhile() -метод был хитростью.

behaviorSubject.pipe(
   skipWhile(value => !value), // skip null values
   take(1)) // in my case, I need the value only once
   .subscribe(value => doYourWork());
0 голосов
/ 10 мая 2018

Вы должны просто иметь возможность вызывать имя BehaviorSubject с помощью .getValue (), что-то вроде:

let x = new BehaviorSubject<any>;
...
x.getValue()
...