首页 > 解决方案 > 可观察的返回空值

问题描述

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

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 作为提供者放入所有模块中

我究竟做错了什么 ?

标签: angularfirebaserxjs

解决方案


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

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

事情不起作用,因为您正在访问服务的新实例,并且您需要一个单例实例才能访问该值。

要么我们这样做: -

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

或仅在Appmodule的提供者中为单例实例添加服务

所以,我会推荐尝试以上两种方法中的任何一种,一切都会对你有用。

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


推荐阅读