可观察到的返回空值

时间:2020-06-16 14:31:01

标签: angular firebase rxjs

我有一个子模块,尝试登录以检查角色。

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;
    }
  }

我已将Service作为提供者放在所有模块中

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

根据我对您的描述中以下一行的理解

我已将服务作为提供者放在所有模块中

由于您正在访问该服务的新实例,并且您需要一个singloton实例才能访问该值,因此这些信息无法正常工作。

我们要么这样做:-

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

或 仅在单个实例

Appmodule 的提供程序中添加服务

所以, 我建议您尝试以上两种方法中的任何一种,这样对您来说一切都会奏效。

*删除所有模块提供程序阵列的服务。并使用 providedIn 方式或仅添加 AppModule 的提供程序。 那么您就拥有一个服务的单例实例,它将获得正确的行为主体和所有其他服务状态值。

答案 1 :(得分:0)

您的“种子”值为空。

如果您希望订阅时最后发出的值,但不需要提供种子值,请查看ReplaySubject! 来源:https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject

所以只需使用:

private user: ReplaySubject<User> = new ReplaySubject<User>(1);
user$: Observable<User> = this.user.asObservable();
....