首页 > 解决方案 > 为什么这个函数不返回任何值?

问题描述

我是 Angular 的新手。我正在尝试创建一个检查用户是否登录的函数,但 onAuthStateChanged 中的函数不返回任何值

 async loginStatus() { 
     firebase.auth().onAuthStateChanged(firebaseUser => {
      if ( firebaseUser) {
       console.log(firebaseUser.uid)
        this.isuser = true
    } else {
       this.isuser = false
    }
  })

return  this.isuser ;
}

打印 loginStatus 未定义

标签: angulartypescriptfirebasefirebase-authentication

解决方案


如果您只是检查一次是否有 firebase 用户,您可以(如 Frank van Puffelen 建议的那样)返回 this .currentUser。无需承诺:

loginStatus(): boolean {
  return !!firebase.auth().currentUser;
}

用法:

checkLoginStatus(): void {
  this.isuser = this.loginStatus();
}

但是,如果您想侦听用户更改,则需要在附加侦听器的方法中执行此逻辑:

loginStatus(): void {
  firebase.auth().onAuthStateChanged((user) => this.isuser = !!user);
}

有了这个,该方法不会返回任何东西。


你也可以考虑使用Observables,不过接下来你不妨看看@angular/fire。一个简单的(未经测试的)Observable 看起来像这样:

readonly loginStatus$: Observable<boolean> = new Observable((subscriber) =>
  firebase.auth().onAuthStateChanged((user) => subscriber.next(!!user))
).pipe(
  distinctUntilChanged(),
  startWith(!!firebase.auth().currentUser),
  shareReplay(1)
);

作为旁注,通过声明类型,您可以告诉打字稿编译器您期望该方法返回什么。如果不符合,它会给你一个描述性错误。调试东西要容易得多:)


推荐阅读