Как получить значение от конструктора сервиса в сервисе angular2

Я пытаюсь разработать Auth Service. Я использую это:

@Injectable()
export class AuthService {

  authState: any = null;

  constructor(private afAuth: AngularFireAuth,
              private db: AngularFireDatabase,
              private router:Router) {

            this.afAuth.authState.subscribe((auth) => {
              this.authState = auth;

            });
          }

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

Функция authenticated() продолжает выдавать мне false, даже если пользователь вошел в систему.

Когда я console.log authState (this.authState) в конструкторе, я получаю значение, но вне конструктора this.authState имеет значение null. Что я делаю неправильно?

3 ответа

Вы можете использовать APP_INITIALIZER, чтобы дождаться завершения асинхронной операции. Пожалуйста, проверьте следующий код:

AuthService.ts

  @Injectable()
  export class AuthService {
      authState: any = null;
     constructor(private afAuth: AngularFireAuth,
          private db: AngularFireDatabase,
          private router:Router) {

      }
  loadValue(){
      return new Promise((resolve, reject) => {
           this.afAuth.authState.subscribe((auth) => {
              this.authState = auth;
              resolve(true);
           });
      }); 
  }
  // Returns true if user is logged in
 get authenticated(): boolean {
   return this.authState !== null;
 }
}

app.module.ts

import { NgModule, APP_INITIALIZER } from '@angular/core';

 @NgModule({
  //...
  providers: [AuthService, 
    {
        provide: APP_INITIALIZER,
        useFactory: (authService: AuthService) => () => authService.loadValue(),
        deps: [AuthService],
        multi: true
    }]
  ///....
 })

Надеюсь, поможет!!

Зачем вам нужно усложнять вопрос

В вашем компоненте, где вам требуется значение, сделайте это

authState : boolean;

constructor(private afAuth: AngularFireAuth) {

            this.afAuth.authState.subscribe((auth) => {
              this.authState = ( auth !== null ) ? true : false;

            });
          }

Лучше было бы иметь отдельную функцию

authenticated(): Observable<User> {
    return this.afAuth.authState;
  }

тогда в вашем компоненте вы можете подписаться на этот метод, как вы это делали в конструкторе сервисов

Под редакцией!

Другие вопросы по тегам