Наблюдаемое возвращающее нулевое значение - PullRequest
0 голосов
/ 16 июня 2020

У меня есть дочерний модуль, который пытается войти в систему, проверяя роль.

this.auth.user$.subscribe(u => console.log(u)) // Child returning null

Сервис

     private user: BehaviorSubject<User> = new BehaviorSubject<User> (null);
      user$: Observable<User> = this.user.asObservable();
async getUser() {
    try {
      const { token, claims, expirationTime } = await (await this.afAuth.currentUser).getIdTokenResult(true);
      const { name, email } = claims;
      const expiry = Date.parse(expirationTime);
      const authDetails = { token, name, email, expiry };
      if (claims.claims && claims.claims.length === 1) {
        const { groupId, role } = claims.claims[0];
        this.user.next({ ...authDetails, groupId, role });
      } else if (claims.claims && claims.claims.length > 1) {
        this.user.next({ ...authDetails, allClaims: claims.claims });
      }
      return this.user;
    } catch (err) {
      throw err;
    }
  }

Я поместил Сервис во все модули как провайдеры

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 16 июня 2020

В соответствии с моим пониманием со строкой ниже в вашем описании

Я поставил Службу во все модули в качестве поставщиков

* 1006 a новый экземпляр службы , и вам нужен экземпляр синглотона для доступа к значению.

Либо мы делаем это: -

    @Injectable({
      providedIn: 'root',
    })
export class YourService {
}

ИЛИ Добавляем службу только у поставщиков Appmodule для экземпляра singleton

Итак, я рекомендую попробовать любой из двух вышеупомянутых методов, и все будет работать для вас.

* Удалить сервис для всего массива поставщиков модулей. и либо используйте providedIn , либо добавьте в провайдер AppModule только . тогда у вас есть одноэлементный экземпляр службы, и вы получите правильное значение субъекта поведения и всех остальных состояний службы.

0 голосов
/ 16 июня 2020

Ваше "начальное" значение равно нулю.

Если вам нужно последнее переданное значение (я) по подписке, но не нужно указывать начальное значение, проверьте вместо этого ReplaySubject! Источник: https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject

Так что просто используйте:

private user: ReplaySubject<User> = new ReplaySubject<User>(1);
user$: Observable<User> = this.user.asObservable();
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...