【问题标题】:why this function not return any value?为什么这个函数不返回任何值?
【发布时间】:2020-09-28 08:52:21
【问题描述】:

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

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

return  this.isuser ;
}

打印登录状态未定义

【问题讨论】:

  • 谢谢,我知道,但是所有这些解决方案都对我不起作用,返回未知值。 @FrankvanPuffelen

标签: angular typescript firebase firebase-authentication


【解决方案1】:

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

并且基于这里的firebase文档

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

firebase.auth 不是异步函数。你不需要等待它。

为了实现像这样有意义的回调

const userObject = await loginStatus()

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

async loginStatus() { 
  return new Promise((resolve) => {
     firebase.auth().onAuthStateChanged(firebaseUser => resolve(firebaseUser))
  })
}

希望这会有所帮助。

【讨论】:

  • 为什么不只是resolve(!!firebaseUser) 而不是if/else? auth.onAuthStateChanged(firebaseUser => resolve(!!firebaseUser))
  • @MatthewLayton 我同意你解决用户对象将是一个更好的代码结构。但我不确定他在这里的意图。我只是想尽可能地重用他的代码结构。他可能想在 if/else 语句中添加一些逻辑。
  • 谢谢,但返回对象auth[object Promise] 如何在没有函数this.checkLoginStatus().then((data)=>console.log(data)) 的情况下退出值,因为不能使用值输出函数。 @yueyou
  • 这个函数现在只返回 Promise,因为我试图让它类似于你原来的函数帖子。如果你想在这个函数之外使用用户对象。像resolve(firebaseUser)一样将对象放入resolve中。然后这个函数会返回一个 Promise
  • "+1" 谢谢,但是返回相同的值 [object Promise] ,我不在乎值,我在乎类型,需要返回值才能使用 guard 。我接近于你的回答。 @yueyou
【解决方案2】:

如果您只是检查一次是否有 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)
);

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

【讨论】:

  • 这段代码与简单返回firebase.auth().currentUser有何不同?
  • @FrankvanPuffelen 你是绝对正确的 :) 我把它作为一个承诺归还了它。如果你使用监听器,onAuthStateChanged监听器应该设置isUser部分,如果你只是检查一次,你应该像你说的那样检查.currentUser
【解决方案3】:

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

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

如果您希望在用户登录或注销时执行某个操作,则需要一个身份验证状态侦听器。但在这种情况下,您不能将用户的状态返回给调用者,并且执行该操作的代码应该在身份验证状态侦听器中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多