【问题标题】:onAuthStateChanged return unsubscribe, I want to return currentUseronAuthStateChanged 返回 unsubscribe,我要返回 currentUser
【发布时间】:2018-07-16 15:32:59
【问题描述】:

我在一个使用 firebase (5.2) 的 Angular 项目 (6.0) 中。我正在使用该功能:

firebase.auth().onAuthStateChanged

这个函数返回一个firebase.Unsubscribe,我不掌握。我只知道使用 Observables、Subjects 和 Promise。

我想将此函数用作可观察对象,例如,每当我找回 currentUser 时,我都会订阅它。

到目前为止,我已经尝试将它包装成一个 observable:

auth.service.ts

  loadUser() {
    return Observable.create((observer: Observer<any>) => {
      firebase.auth().onAuthStateChanged(
        currentUser => { return currentUser }
      )
    })
  }

每当我启动我的 Angular 应用程序时,我都会订阅:

在 ngOnInit 中:

this.authService.loadUser()
  .subscribe(
    response => {
      console.log("response");
      console.log(response);
    },
    error => {
      console.log("error");
      console.log(error);
    }
  )

但订阅永远不会被触发。我没有正确包装 Firebase 的功能。 1. 我真的不明白他们为什么返回 firebase.unsubscribe。 2. 我该如何解决这个挑战?

谢谢

【问题讨论】:

  • 代替currentUser =&gt; { return currentUser }试试currentUser =&gt; { observer.next(currentUser) }

标签: angular firebase firebase-authentication


【解决方案1】:

如果您考虑使用库angularfire2(我真的建议您至少在您的应用程序中尝试一下),您可以利用AngularFireAuth 等可注入服务来跟踪身份验证状态作为可观察对象。下面是使用 AngularFire2 中的 AngularFireAuth 获取当前用户信息、检查用户是否登录以及登录/注销的示例

import { firebase } from '@firebase/app';
import { AngularFireAuth } from 'angularfire2/auth';
import { User, UserCredential } from '@firebase/auth-types';
import { Observable } from 'rxjs';
import { take, map } from 'rxjs/operators';
...

user: Observable<User>;

constructor(private afAuth: AngularFireAuth) {
  this.user = this.afAuth.authState;
}

getUser(): Observable<User> {
  return this.user.pipe(take(1));
}

isLoggedIn(): Observable<boolean> {
  return this.user.pipe(
    take(1),
    map(authState => !!authState)
  );
}

logUser() {
  this.getUser().subscribe(user => console.log(user));
}

login(): Promise<UserCredential> {
  return this.afAuth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider());
}

logout() {
  return this.afAuth.auth.signOut();
}

希望对您有所帮助!

【讨论】:

  • 哦,我明白了。我正在使用 firebase 库。如果我不需要更改太多东西,我会尝试使用 angularfire2。你能告诉我有什么不同吗?一个比另一个好吗?还是只是 angularfire2 有点适合 Angular 应用程序?
  • @AlbertMunichMar angularfire2 做了很多工作,将 firebase 身份验证、实时数据库、存储和其他事件转换为可观察的流和可注入、可测试/可模拟的服务。虽然您绝对可以从源 firebase 事件手动创建 observables,但 angularfire2 还公开了其他实用程序,用于帮助跟踪列表/对象的更改以及常见数据显示和操作任务的配方。我建议尝试一下,但这只是我个人的观点,它使使用 firebase 时变得更容易。谢谢!
猜你喜欢
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
相关资源
最近更新 更多