Angular 2 功能不一致 运行

Angular 2 function not running consistently

组件:

import { Component, OnInit } from '@angular/core';
import { AF } from "../angularfire.service";

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.less']
})
export class LoginComponent implements OnInit {

  constructor(private afService: AF) { }

  ngOnInit() {
    this.afService.checkUser();
  }

}

服务内部函数:

checkUser() {
    var user = firebase.auth().currentUser;

    if (user) {
      this.router.navigate(['/dashboard']);
    } else {
      console.log("not logged in");
    }
  }

基本上,如果用户已登录,该功能会将用户重定向到仪表板视图。当通过另一个视图访问视图(应用程序登录)时,它工作得很好,但如果您要通过键入url,该函数不执行重定向,而是记录 "not logged in"。

首先,正如 firebase 文档中提到的那样:can view it here

Note: currentUser might also be null because the auth object has not finished initializing. If you use an observer to keep track of the user's sign-in status, you don't need to handle this case.

所以这就是解释你的问题并解释为什么你的 setTimeout 解决了这个问题,因为它 return 是一个可观察的。
其次,根据您在上面写下的语法,我假设您不使用 AngularFire2 服务(只是缺少对您的服务的描述),所以我建议您使用 AngularFire2 因为它更简单, 并提供简单的 API 与 angularfire-database.
进行通信 我可以建议以下解决方案 AngularFire2:
组件:

//basically the same.  

服务:

import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
import { AngularFire, AuthProviders, AuthMethods } from 'angularfire2';
import 'rxjs/Rx' ;
import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/first';

constructor(public af: AngularFire){}
 checkUser() {
  this.af.auth.first().toPromise().then(user => {
   if (user) {
     this.router.navigate(['/dashboard']);
   } else {
     console.log("not logged in");
   }
  }
 });

只需根据您的代码进行调整,尽情享受吧:)