我怎样才能立即得到观察者的回复?

时间:2017-07-12 17:20:45

标签: angular observable angularfire2

我需要知道用户是否已登录,但是当我检查时,AngularFireAuth还没有给出响应,因此我认为我没有登录。

我的服务:

loggedIn = false;

constructor(private afAuth: AngularFireAuth) {
  this.afAuth.authState.subscribe(user=>{
    this.loggedIn = true;
  });
}

然后我有我的警卫:

@Injectable()
export class OnlyLoggedInUsersGuard implements CanActivate {

  constructor(private user: UserService) {}

  canActivate(){
      return this.user.loggedIn? true:false;
  }

当我尝试打开仪表板时,它表示我没有登录,因为它在构建服务之后检查,但在observable将loggedIn更改为true之前。

1 个答案:

答案 0 :(得分:1)

您可以在UserService内设置:

private loggedInSubject = new BehaviorSubject<bool>(false);
public loggedIn = this.loggedInSubject.asObservable().distinctUntilChanged();

constructor(
    private afAuth: AngularFireAuth
) {
  this.afAuth.authState
      .subscribe(user=> {
          this.loggedInSubject.next(true);
      });
}

然后,您可以在Guard

中调用它
canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
): Observable<boolean> {
    return this.user.loggedIn.take(1);
}