【问题标题】:Observable returning null value可观察的返回空值
【发布时间】:2020-06-16 14:31:01
【问题描述】:

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

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

我做错了什么?

【问题讨论】:

  • 在您订阅的那一刻,用户的价值似乎仍然为空。什么时候使用 getUser 函数?之后console.log怎么样?
  • 有一个登录页面,注册功能被激活并调用getUser()。并且此时出现值....然后它加载子模块然后调用 subscribe 。价值为空。我对 Observables 不是很熟悉 ..

标签: angular firebase rxjs


【解决方案1】:

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

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

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

我们要么这样做:-

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

或 仅在 Appmodule 的提供者中为 单例实例

添加服务

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

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

【讨论】:

    【解决方案2】:

    您的“种子”值为空。

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

    所以只需使用:

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

    【讨论】:

    • 现在订阅的console.log没有输出
    • 你在调用 getUser()。是否遇到两个 if .. else if 路径之一并调用下一个?
    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2017-04-19
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多