我是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未定义
答案 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状态侦听器内。