为什么这个函数不返回任何值?

时间:2020-06-09 08:25:39

标签: angular typescript firebase firebase-authentication

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

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

return  this.isuser ;
}

print loginStatus未定义

3 个答案:

答案 0 :(得分:1)

如果您仅检查一次Firebase用户,则可以(如Frank van Puffelen建议的那样)返回此.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)
);

附带说明一下,通过声明类型,可以告诉打字稿编译器您期望该方法返回什么。如果不符合要求,它将给您带来描述性错误。调试起来要容易得多:)

答案 1 :(得分:0)

您的 loginStatus 函数不会返回任何内容。 return语句位于您的 onAuthStateChanged 回调中。您将返回一个始终为真的赋值表达式。

并且基于此处的Firebase文档

https://firebase.google.com/docs/reference/js/firebase.auth

firebase.auth 不是异步功能。您无需等待。

为了实现有意义的回调,例如

[[137.0, 137.25, 137.5], [136.5, 137.0, 137.5, 138.0]]

您需要在loginStatus函数中返回一个Promise,如下所示

const userObject = await loginStatus()

希望这会有所帮助。

答案 2 :(得分:0)

如果您想知道用户的当前登录状态,则无需附加侦听器。您只需阅读firebase.auth().currentUser

async loginStatus() { 
  return firebase.auth().currentUser != null
}

如果您想登录或注销时执行某些操作,则需要一个身份验证状态侦听器。但是在那种情况下,您无法将用户的状态返回给调用方,执行该操作的代码应该在auth状态侦听器内。