AngularFire2暂停返回值FAIL

时间:2017-11-16 23:45:25

标签: angular typescript firebase rxjs observable

我的authService中有这段代码

    constructor(
    private afAuth: AngularFireAuth,
    private db: AngularFireDatabase,
    private router: Router
  ) {
    this.authState = afAuth.authState;
    this.authState.subscribe((user: firebase.User) => {
        this.authState = user;
    });
    if ( this.authenticated ) {
      // this.router.navigate([`/content`]);
    }
  }

  // Returns true if user is logged in
  get authenticated(): any {
    return this.authState;
  }

我调用get authenticated并返回undefined:

COMPONENT

    constructor(
    private auth: AuthService
  ) {
      this.currentUser = this.auth.authenticated;
  }
showUser() {
    console.log(this.currentUser.uid);
  }

我需要帮助解决它,任何想法?

3 个答案:

答案 0 :(得分:0)

你的目的是什么?你需要什么以及为什么?

我仍然不知道你为什么需要这样的东西。但我认为它是生命周期钩子的问题(you can find here the doc)。

试试这样。这是你的组件

export class *YOUR_COMPONENT* implements OnInit {

   private authenticatedUser$: Subscription; <= import rxjs/Subscription
   private authenticatedUser: User; <= import firebase/app

   constructor(private auth: AuthService) {
     this.authenticatedUser$ = this.auth.getAuthenticatedUser().subscribe((user: User) => {
      // Here you're saving the firebase.user in your var authenticatedUser
      this.authenticatedUser = user;
   });

   ngOnInit() {
      // Check if user is logged in..
      if(this.authenticatedUser) {
        // When true, your code here..
      }
   }

   ....}

在这里你的authService:

   export class authService {

     constructor(private afAuth: AngularFireAuth) { <= import angularfire2/auth/auth
       // constructor is empty
     });

     getAuthenticatedUser() {
       return this.auth.authState;
     }

   ....}

这应该有用..

答案 1 :(得分:0)

发生的事情是正常的。 console.log是同步调用。订阅中的内容是异步的。所以即使{。1}}是在.subcribe之后写的,也可以更快地执行。这就是console.log打印console.log( this.authState.uid );

的原因

另外,我会避免在undefined中添加任何逻辑。

最好使用.subscribe contructor并尝试访问OnInit()生命周期中的this. authState

最后请注意,您甚至可以保存订阅AfterViewInit()OnInit .unsubscribe:)

答案 2 :(得分:0)

AngularFireAuth.authState是异步和ObservableYou can read up on what an Observable is here on the ReativeX site

在sort中,authState observable是一段随时间变化的值,aysnc(需要一些时间来解析)和lazy(你需要订阅才能得到一个值,这就是你的console.log外部不起作用的原因。 )

如果您需要访问&#34;当前&#34;订阅块之外的值我建议使用BehaviorSubjectagain check out ReactiveX for more information on subjects):

currentAuthState: BehaviorSubject<firebase.User|null|undefined>;

constructor(afAuth: AngularFireAuth) {
  this.currentAuthState = new BehaviorSubject(undefined);
  afAuth.authState.subscribe(this.currentAuthState);
}

然后您可以访问:this.currentAuthState.getValue()以查看当前值是什么; .subscribe倾听变化;使用任何其他RxJS运算符,如map,do,swtichMap等;并在视图{{ (currentAuthState | async)?.email }}

中使用异步管道

加载时为undefined,如果没有用户登录则为null,如果用户已登录则为firebase.User