【问题标题】:Auth value null outside of block [duplicate]块外的验证值 null [重复]
【发布时间】:2017-07-28 05:12:50
【问题描述】:

我正在尝试从 Firebase google login 获取当前用户信息,但我真的很困惑为什么 angularfire 不允许我存储当前用户信息。当我尝试输出this.user 的值但在块外返回null 值时,将返回当前用户信息。需要一点帮助来解决这个问题。

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { FlashMessagesService } from 'angular2-flash-messages';
import { FirebaseService } from '../../services/firebase.service';
import * as firebase from 'firebase';
import { AngularFire, FirebaseAuthState } from 'angularfire2';

@Component({
  selector: 'app-navbar',
  templateUrl: './navbar.component.html',
  styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {
  public user: FirebaseAuthState;
  public userProfiles: any;
  public displayName: string;

  constructor(
    public af:AngularFire,
    public flashMessage:FlashMessagesService,
    private firebaseService: FirebaseService,
    private router:Router
  ) {
    this.af.auth.subscribe(user => {
      if(user) {
      // user logged in
        this.user = user;
        console.log('if');
        console.log(this.user);
      }
      else {
      // user not logged in
        // this.user = ;
        console.log('else');
      }
    })
    console.log(this.user);
  }

  ngOnInit() {
    this.af.auth.subscribe((state: FirebaseAuthState) => {
      this.userProfiles = state;
      this.displayName = this.userProfiles.auth.displayName;
      // console.log(this.userProfiles);
    });
    console.log(this.firebaseService.getCurrentUser());
  }

  login(){
    this.af.auth.login();
  }

  logout(){
    this.af.auth.logout();
    this.flashMessage.show('You are logged out',
    {cssClass: 'alert-success', timeout: 3000});
  }

  username(){

  }
}

【问题讨论】:

  • 嗯,它是异步的,所以在块外的 console.log() 中,user 为 null,因为 observable 尚未发出任何值(http 请求尚未完成)。
  • @AJT_82 我已经阅读了您提供的页面,但您能否提供一些我将如何做到的示例?

标签: angular typescript firebase firebase-authentication


【解决方案1】:

当我尝试输出 this.user 的值时返回当前用户信息,但在块外返回空值。需要一点帮助来解决这个问题。

放大您的代码

 this.af.auth.subscribe(user => {
  if(user) {
  // user logged in
    this.user = user;
    console.log('if');
    console.log(this.user);
  }
  else {
  // user not logged in
    // this.user = ;
    console.log('else');
  }
})
console.log(this.user);

调用this.af.auth.subscribe( 是异步的,对同步代码没有影响。这本质上类似于

this.user = null;
setTimeout(() => {
  this.user = 'something'
});
console.log(this.user); // null!

修复

在订阅块内使用用户。如果您想对非空用户执行操作,请随时从订阅内部调用函数。

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多